(function(browserdetect) {

	// Quicksmode script:
	// This script is based onpen a quirksmode script that can be found here
	// : http://www.quirksmode.org/js/detect.html
	// Browser detection should be avoided, object detection should be used instead. 
	// More about this: http://www.quirksmode.org/js/support.html
	 
	// public functions
	browserdetect.browser = function() {
		var static = arguments.callee;
		if (!static.result) { static.result = private.searchString(private.dataBrowser()) || "An unknown browser"; }
		return static.result;
	}
	browserdetect.version = function() {
		var static = arguments.callee;
		if (!static.result) { 
			static.result = private.searchVersion(private.dataBrowser(),navigator.userAgent) || private.searchVersion(navigator.appVersion) || "an unknown version"; 
		}
		return static.result;		
	}
	browserdetect.os = function() {
		var static = arguments.callee;
		if (!static.result) { static.result = private.searchString(private.dataOS()) || "an unknown OS"; }
		return static.result;
		
	}
	// private functions
	var private = {};
	private.searchString = function(data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			if (dataString) { if (dataString.indexOf(data[i].subString) != -1) { return data[i].identity; } }
			else if (dataProp) { return data[i].identity; }
		}
	}
	private.searchVersion = function(data,dataString) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			var versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) { if (dataString.indexOf(data[i].subString) != -1) { break; } }
			else if (dataProp) { break; }
		}
		if (data.length==0 || !versionSearchString) return;
		var index = dataString.indexOf(versionSearchString);
		if (index == -1) return;
		var result = parseFloat( dataString.substring(index+versionSearchString.length+1) );
		return result;
	},
	private.dataBrowser = function() {
		return [
			{ string: navigator.userAgent,subString: "OmniWeb",versionSearch: "OmniWeb/",identity: "OmniWeb" },
			{ string: navigator.vendor, subString: "Apple", identity: "Safari"},
			{ 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" },
			{ string: navigator.userAgent, subString: "Netscape", identity: "Netscape" }, // for newer Netscapes (6+)
			{ string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE" },
			{ string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" },
			{ string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla" } // for older Netscapes (4-)
		];
	}
	private.dataOS = function() {
		return [
			{ string: navigator.platform, subString: "Win", identity: "Windows" },
			{ string: navigator.platform, subString: "Mac", identity: "Mac" },
			{ string: navigator.platform, subString: "Linux", identity: "Linux" }
		];
	}

})(window.browserdetect = (window.browserdetect) ? window.browserdetect : {});