/* ==============================================
 *      DOCUMENTAZIONE SUL COSTRUTTORE Cookie
 * ==============================================
 * Sintassi:
 * _________________________________________________
 * var A=new Cookie(name,hoursExpires,path, domain)
 * _________________________________________________
 * dove name, path, domain sono stringhe che
 * corrispondono ai rispettivi attributi del
 * cookie. Mentre hoursExpires è un intero positivo
 * o negativo, che specitifica la durata in ore
 * del cookie a partire dalla data corrente.
 * Name è obligatorio, mentre gli altri possono
 * anche essere omessi. Il valore di default
 * di path e domain è la stringa vuota "", mentre
 * di hoursExpires è 0 ed in tal caso il cookie
 * è di tipo non permanente.
 *
 * N.B. Per evitare conflitti con i nomi di
 *      proprietà create dall'utente, tutti i nomi
 *      delle proprietà e dei metodi predefiniti
 *      dell'oggetto, hanno come suffisso il
 *      simbolo di dollaro ($)
 *
 * Proprietà (di istanza):
 * - $name 
 *   Il nome del cookie.
 * - $path
 *   Valore associato all'atributo path del cookie
 * - $domain
 *   Valore associato all'atributo domain del cookie
 * - $hoursExpires
 *   Un intero che stabilisce la durata in ore, della
 *   vita del cookie. Se il valore è negativo,
 *   il metodo $store concellerà il cookie.
 *
 * Metodi (di istanza)
 * - $clear
 *   Cancella tuttele proprietà dell'oggetto, ad 
 *   eccezione di quelle predefinite.
 * - $exist
 *   Restituisci true se il cookie esiste già,
 *   altrimenti false.
 * - $load
 *   Carica i valori del cookie, nelle proprietà
 *   dell oggetto.
 * - $remove
 *   Rimuove il cookie. L'oggetto resta inalterato.
 * - $store
 *   Memorizza i valori delle proprietà dell'oggetto
 *   nel cookie.
 *
 * Metdi (di classe)
 * - remove(name)
 *   Elimina un cookie.
 *
 * ==========
 * = ESEMPI =
 * ==========
 *
 * Es1: Crea un cookie permanente Utente, vi 
 *      memorizza alcune preferenze. La durata
 *      di vita del cookie è di 3 giorni
 * __________________________________________________
 * var A=new Cookie("Utente",3*24)
 * A.colorePreferito="Azzurro"
 * A.sitoPreferito="www.yahoo.it"
 * A.numeroVisite=1
 * A.store()
 * __________________________________________________
 *
 * Es2: Come l'Es1, ma con cookie non permanente
 * __________________________________________________
 * var A=new Cookie("Utente")
 * A.colorePreferito="Azzurro"
 * A.sitoPreferito="www.yahoo.it"
 * A.numeroVisite=1
 * A.$store()
 * __________________________________________________
 *
 * Es3: Con riferimento al cookie creato nell'Es1,
 *      carica le proprità dell'oggetto dal cookie,
 *      incrementa di uno il contatore delle visite,
 *      e memorizza il cookie.
 * __________________________________________________
 * var A=new Cookie("Utente",3*24)
 * if (A.exist()){A.$load()
 *                A.numeroVisite+=1
 *                A.$store()}
 * __________________________________________________
 *
 * Es4: Cancella un cookie (con il metodo d'istanza)
 * __________________________________________________
 * var A=new Cookie("Utente",3*24)
 * A.$remove()
 * __________________________________________________
 *
 * Es5: Cancella un cookie (con il metodo di classe)
 * __________________________________________________
 * Cookie.remove("Utente")
 * __________________________________________________
 *
 * Es6: Cancella un cookie (impostando una data di
        scadenza antecedente a quella corrente)
 * __________________________________________________
 * var A=new Cookie("Utente",3*24)
 * A.$hourExpires=-1
 * A.$store()
 * __________________________________________________
 *
*/

// Definizione del costruttore Cookie

function Cookie(name,hoursExpires,path,domain){
// Definisce le proprietà d'istanza
this.$name=name
this.$hoursExpires=hoursExpires || 0
this.$path=path 
this.$domain=domain}

// Consente di create l'oggetto prototipo
new Cookie("iniz")

// Definisce i metodi di istanza
Cookie.prototype.$clear=clear_cookie
Cookie.prototype.$exist=exist_cookie
Cookie.prototype.$load=load_cookie
Cookie.prototype.$remove=remove_cookie
Cookie.prototype.$store=store_cookie


// Definisce i metodi di classe
Cookie.remove=remove_Cookie


//  Recupera il valore di un cookie
function getCookie(name){ 
var e=new RegExp(name+"=([A-Za-z0-9_%/+*.-]+);?") 
var risultato=e.exec(document.cookie) 
return risultato?risultato[1]:""}

/* ===================================
*  Definizione delle funzioni da
*  associare ai metodi di istanza
*  ===================================
*/

/* Crea o modifica le proprietà dell'oggetto
*  cookie caricandole dal relativo cookie
*/
function load_cookie(){
// Se il cookie non esiste esce.
if (!this.$exist()) return
/* Crea una matrice contenente le stringhe 
 * "variabile=valore". E' necessario usare il metodo
 * slice per eliminare l'ultimo ; della stringa
 * (contenente il valore del cookie). Se si
 * omette slice, il metodo successivo split
 * creerà un elemeno in più vuto nell'array
*/
var valuesCookie=unescape(getCookie(this.$name)).slice(0,-1).split(";")
for (var i=0; i<valuesCookie.length; i++){
var valueCookie=valuesCookie[i].split("=")
this[valueCookie[0]]=valueCookie[1]}
}

/* Crea o modifica un cookie con i valori del
* oggetto Cookie
*/
function store_cookie(){
var strCookie=this.$name+"=",valuesCookie=""
//costruzione del valore el cookie
for (var p in this){
if (p.charAt(0)=="$") continue
valuesCookie+=p+"="+this[p]+";"}
strCookie+=escape(valuesCookie)
//Aggiunge l'attributo expires che indica la scadenza del cookie
if (this.$hoursExpires){
var d=new Date()
d.setHours(d.getHours()+this.$hoursExpires)
strCookie+=";expires="+d.toUTCString()}
//Aggiunge l'attributo path
if (this.$path) strCookie+=";path="+this.$path
//Aggiunge l'attributo domain
if (this.$domain) strCookie+=";domain="+this.$domain
//Salvataggio del cookie
document.cookie=strCookie}

/* Elimina tutte le proprietà che contengono
 * i valori da inserire nel cookie
*/ 
function clear_cookie(){
for (var p in this){
if (p.charAt(0)=="$") continue
delete this[p]}
}

//Elimina un cookie
function remove_cookie(){
var tmp_hoursExpires=this.$hoursExpires
this.$hoursExpires=-1
this.$store()
this.$hoursExpires=tmp_hoursExpires}


/* Restituisce true se il cookie esiste già,
*  altrimenti false
*/
function exist_cookie(){
return getCookie(this.$name)!=""}

/* ===============================
*  Definizione delle funzioni da
*  associare ai metodi di classe
*  ===============================
*/

//Elimina un cookie
function remove_Cookie(name){
var tmp=new Cookie(name)
tmp.$hoursExpires=-1
tmp.$store()}
