﻿/*
USO ###############
if(SrCmndCkes_Leggi('nome')==null) ...
// restituisce il valore, se il cookie non c'è restituisce "null"; se ne sono presenti più di 1 mostra il primo

if(SrCmndCkes_Scrivi('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ì'])) alert('Scrittura non riuscita');
// restituisce TRUE o FALSE a seconda che sia avvenuta o no correttamente la scrittura; la mancanza del valore comporta la cancellazione del cookie, la mancanza dei parametri tempo genera un cookie di sessione, il path "/" è sempre consigliato

if(SrCmndCkes_Cancella('nome' [,'path: "\" per tutto "" per attuale e figli'] [,'Domain'])) alert('OK'); else alert('Ancora No');
// restistuisce TRUE o FALSE; FALSE significa che cmq un cookie con quel nome c'è ancora, e ciò può essere perchè le proprietà non coincidono o perchè ce ne erano più di uno con lo stesso nome

if(SrCmnmCkes_CancellaTutti()) alert('Cookie cancellati'); else alert('Sono rimasti ancora dei cookie');
// restituisce TRUE o FALSE; FALSE significa che dei cookie sono ancora presenti, probabilmente perchè le proprietà non coincidono

if(SrCmndCkes_Visualizza(['nome'])) alert('Il cookie esiste'); else alert('Il cookie non esiste');
// mostra alert con contenuto di tutti i cookie, mettendo in risalto quello eventualmente indicato, con il conteggio delle ripetizioni; restistuisce TRUE, a meno che l'eventuale cookie indicato non esista allora restituisce FALSE; 

NOTE ##############
LETTURA: non è possibile leggere le singole proprietà: expires, path, domain , secure
ELIMINAZIONE: non è possibile eliminare tutto insieme con "document.cookie='';", 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; 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;
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 SrCmndCkes_Leggi(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 SrCmndCkes_Scrivi(name,value,expiresUdM,expires,path,domain,secure){
    if (!name) { return false }
    if (!value) { return SrCmndCkes_Cancella(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 (SrCmndCkes_Leggi(name)==null && secure!=1) { return false } else { return true }
}


function SrCmndCkes_Cancella(CookieNome, CookiePath, CookieDomain){
    var DoveSiTrovaPrima = document.cookie.indexOf(CookieNome);
    if(DoveSiTrovaPrima==-1) {   // se non c'è si taglia corto
        return true;
    } else {
        if( CookiePath &&  CookieDomain) { SrCmndCkes_Scrivi(CookieNome,'cancellato','anni',-1,CookiePath,CookieDomain); }  // dovevo inventare un contenuto sennò saltava la scrittura
        if( CookiePath && !CookieDomain) { SrCmndCkes_Scrivi(CookieNome,'cancellato','anni',-1,CookiePath); }
        if(!CookiePath &&  CookieDomain) { SrCmndCkes_Scrivi(CookieNome,'cancellato','anni',-1,'',CookieDomain); }
        if(!CookiePath && !CookieDomain) { SrCmndCkes_Scrivi(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
    }
}


function SrCmndCkes_CancellaTutti(){
    stringa=document.cookie.split(";");
    for(i=0;i<stringa.length;i++) {
        var c=stringa[i].split("=");
        if(c[0]) SrCmndCkes_Cancella(c[0],'/');
        };
    return (document.cookie.length==0);
}


function SrCmndCkes_Visualizza(CookieNome){
    // recupera info su tutti i cookie
    testo= 'STRINGA COOKIES\nContenuto= \"' +unescape(document.cookie)+ '\"\n\n';
    esito=1;
    // recupera info sul cookie richiesto
    if(CookieNome) {
        cloni=0;
        valore=SrCmndCkes_Leggi(CookieNome);
        if(valore==null){
            esito=0;
        }else{
            i=-1;
            do { i=document.cookie.indexOf(CookieNome+"=",i+1); if(i!=-1) cloni++; } while(i!=-1);
            testo+='SINGOLO COOKIE\nNome= \"' +CookieNome+ '\"\nPrimo Valore= \"' +valore+ '\"\nRipetizioni= '+cloni;
        }
    }
    // produce output
    alert(testo);
    if(esito==1) return true; else return false;
}
//-------------------------------------------------------------------------------------------------------------
//BROWSER DETECTION
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();


