function browserDetector()
{
	var browsers = "(ie4|ie55|ie5|ie6|ns6|ns4|op6|op7|opera|explorer|netscape)"
		
	var token = new RegExp(browsers);
	var tokenSintax = new RegExp (browsers + "| " , "gi")
	var operatorsSintax = /(\(|\)|&&|\|\||!)/g;
	
	//definizione delle variabili di detection del browser
	var ie4  =  (document.all && !window.opera ? true : false);
	var ie5  =  (document.all && !document.fireEvent && !window.opera ? true : false);
	var ie55 =  (document.all && document.fireEvent && !document.createComment ? true : false);
	var ie6  =  (document.all && document.fireEvent && document.createComment ? true : false);
	
	var ns6  =  (!document.all && !window.opera && document.getElementById ? true : false);
	var ns4  =  (document.layers ? true : false);
	
	var op6  =  (window.opera && !document.createComment ? true : false);
	var op7  =  (window.opera && document.createComment ? true : false);
	
	var explorer = ie4 || ie5 || ie55 || ie6;
	var netscape = ns6 || ns4;
	var opera = op6 || op7;
	
	this.detect = function(expression) 
	{
		/*
		restituisce true se l'espressione passata è vera. 
		i token dell'espressione equivalgono alle variabili di detection
		gli operatori sono:
			&& = and
			|| = or
			( ) = parentesi per sottoespressione
			! = not
		*/
		var sintaxError = "";
		sintaxError = expression.replace(tokenSintax,"");
		sintaxError = sintaxError.replace (operatorsSintax, "");
		
		if (sintaxError.length > 0) 
		{
			alert ("Errore: il comando " + sintaxError.toUpperCase() + " non è riconosciuto")
			return false;
		}
				
		while (token.test(expression))
		{
			last = token.exec(expression)
			expression = expression.replace(last[0], eval(last[0])) //rimpiazza nella stringa dell'espressione il valore della variabile corrispondente
		}
		return eval(expression) ? true : false
	}
}