/*
CookieLeggi
OUTPUT: restituisce il valore, se il cookie non c'è restituisce "null"; se ne sono presenti più di 1 mostra il primo, ovvero quello più specifico; es: var AAA = CookieLeggi(nome) || "anonimo";
INPUT:  ('Nome del Cookie')

CookieScrivi
OUTPUT: restituisce TRUE o FALSE a seconda che sia avvenuta o no correttamente la scrittura; la scrittura ha un ordine: dal più specifico al più generico "/"; es: if (!CookieScrivi(document.cok.ckNome.value,document.cok.ckDato.value,document.cok.exSimb.value,document.cok.exDato.value,document.cok.ckPat.value,document.cok.ckDom.value,document.cok.ckSec.value)) alert('Scrittura non riuscita');
INPUT:  ('Nome del Cookie', 'Valore in stringa', 'UdM: anni/mesi/giorni/ore/minuti/secondi/GMT: se non specificato è temporaneo', 'tempo', 'path: "/" per tutto "" per attuale e figli', 'Domain', 'Secure: per criptare basta "1" o "secure" mentre vuoto o altro per lasciare così')  

CookieCancella
OUTPUT: restituisce TRUE o FALSE a seconda che sia avvenuta o no correttamente la cancellazione; restituire FALSE quando rimane cmq un cookie con quel nome e ciò può essere perchè le proprietà non coincidono o perchè ce ne erano più di uno con lo stesso nome; es: if (!CookieCancella(document.cok.ckNome.value)) alert('Cancellazione non riuscita')
INPUT:  ('Nome del Cookie', 'Path: "/" per tutto "" per attuale e figli', 'Domain')
*/

function CookieLeggi(CookieNome)
	{
	if (CookieNome.length==0) return null;
	var PosizioneIniziale = document.cookie.indexOf(CookieNome+"=");
		if (PosizioneIniziale == -1) return null;
		PosizioneIniziale += CookieNome.length+1;  // restituisce la posizione del primo carattere del valore della variabile-cookie
	var PosizioneFinale = document.cookie.indexOf(";",PosizioneIniziale);
		if (PosizioneFinale == -1) PosizioneFinale = document.cookie.length;  // serve perchè se il cookie è l'ultimo non avrà ";"
	return unescape(document.cookie.substring(PosizioneIniziale,PosizioneFinale));
	}

function CookieScrivi(name,value,expiresUdM,expires,path,domain,secure)
	{
	if (!name) { return false }
	if (!value) { return CookieCancella(name); }  // se è vuoto non si può fare la scrittura purtroppo, perchè, mentre in NN esiste il cookie vuoto "nome=;", in IE viene scritto "nome;" e quindi al check non risulta e inoltre occupa spazio
	if ((expiresUdM && expires) && (expiresUdM!='GMT')) {
		var ExpiresMillisec = ExpiresDate = Oggi = new Date();
		switch (expiresUdM) {    // calcola i JS-millisecondi del momento di scadenza
			case "anni":    ExpiresMillisec=Oggi.getTime()+expires*365*24*60*60*1000; break;
			case "mesi":    ExpiresMillisec=Oggi.getTime()+expires*31*24*60*60*1000; break;
			case "giorni":  ExpiresMillisec=Oggi.getTime()+expires*24*60*60*1000; break;
			case "ore":     ExpiresMillisec=Oggi.getTime()+expires*60*60*1000; break;
			case "minuti":  ExpiresMillisec=Oggi.getTime()+expires*60*1000; break;
			case "secondi": ExpiresMillisec=Oggi.getTime()+expires*1000; break;
			default:        ExpiresMillisec=Oggi.getTime()+expires;  // ha poco senso ma qlcs ci andava messo
			}
		ExpiresDate.setTime(ExpiresMillisec);   // converte JS-millisecondi in Date
		expires = ExpiresDate.toGMTString(); }  // converte Date in GMT-stringa
	secure = (secure=="1" || secure==1 || secure=="secure") ? 1 : "";
	document.cookie = name + "=" +escape(value) +
	        ( (expiresUdM && expires) ? "; expires=" + expires : "") +
	        ( (path) ? "; path=" + path : "") + 
	        ( (domain) ? "; domain=" + domain : "") +
	        ( (secure) ? "; secure" : "");

	if (CookieLeggi(name)==null && secure!=1) { return false } else { return true }
	}


function CookieCancella(CookieNome,CookiePath,CookieDomain)
	{
	var DoveSiTrovaPrima = document.cookie.indexOf(CookieNome);
	if(DoveSiTrovaPrima==-1) {   // se non c'è si taglia corto
		return true;
	} else {
		if( CookiePath &&  CookieDomain) { CookieScrivi(CookieNome,'cancellato','anni',-1,CookiePath,CookieDomain); }  // dovevo inventare un contenuto sennò saltava la scrittura
		if( CookiePath && !CookieDomain) { CookieScrivi(CookieNome,'cancellato','anni',-1,CookiePath); }
		if(!CookiePath &&  CookieDomain) { CookieScrivi(CookieNome,'cancellato','anni',-1,'',CookieDomain); }
		if(!CookiePath && !CookieDomain) { CookieScrivi(CookieNome,'cancellato','anni',-1); }
		var DoveSiTrovaDopo = document.cookie.indexOf(CookieNome);
		if(DoveSiTrovaPrima!=DoveSiTrovaDopo) { return true } else { return false } // se Prima<>Dopo vuol dire che qualcosa è stato fatto; si guarda a questo e non alla semplice verifica di lettura perchè in presenza di 2 cookie omonimi la verifica fallirebbe
	} }
// i browser cancellano i cookie nel momento preciso in cui vengono scritti con un qls "expires" scaduto
// o nel momento in cui recuperano i cookies con "document.cookie" e trovano che "expires" è scaduto o non esiste
// nb: c'è chi per cancellare scrive la scadenza "Thu, 01 Jan 1970 00:00:01 GMT" ma se qualcosa è errato, mentre NN ricoscosce abbastanza tutto, IE no e quindi questo invece che cancellare un cookie ne scrive uno che non scade mai
// nb: non è vero che IE cancella i cookie se si inserisce in contenuto vuoto, è solo un'apparenza, poichè tale contenuto è salvato come "nome;" che quindi nella lettura non viene trovato perchè si cerca "nome=;" quindi sembra cancellato invece c'è, occupa spazio, ed è inutilizzato


function CookieVisualizza(CookieNome)
	{
	// conta il numero di cloni
	if(CookieNome) {
		var i = cloni = 0;
		while ( i!=-1 ) {
			i = document.cookie.indexOf(CookieNome,i+1);
			if (i!=-1) cloni++; }
	} else {
		var cloni = ''; }
	// elabora il testo di output
	var valore = (CookieLeggi(CookieNome)!=null) ? CookieLeggi(CookieNome) : '';
	var testo= 'STRINGA COOKIES\nContenuto= \"'+unescape(document.cookie)+'\"\n\nSINGOLO COOKIE\nNome= \"'+CookieNome+'\"\nValore= \"'+ valore +'\"\nRipetizioni= '+cloni;
	alert(testo);
	}
// non è possibile leggere le singole proprietà: expires, path, domain , secure