(function($) {
	$(function() {
		if (!$('#items').length) {
			$('#prolog, #page').show();
			$('#trace').hide();
			return;
		}

		// var $dts = $('#items dt'), $dds = $('#items dd');
		var $dts = $('#items dt').hide(), $dds = $('#items dd').hide();
		var fill = {
			time: function() {
				var d = new Date(), h = d.getHours(), m = d.getMinutes();
				return ((h > 9) ? h : '0'+h)+':'+((m > 9) ? m : '0'+m)+' Uhr';
			},
			clipboard: function() {
				try{return window.clipboardData.getData('Text');}
				catch(e) {return false;};
			},
			screen: function() {
				if ($('body').hasClass('en')) {
					return 'Resolution '+screen.width+'x'+screen.height+', color depth '+screen.colorDepth+'Bit';
				}
				return 'Auflösung '+screen.width+'x'+screen.height+', Farbtiefe '+screen.colorDepth+'Bit';
			},
			browser: function() {
				return BrowserDetect.browser+' '+BrowserDetect.version;
			},
			os: function() {
				return BrowserDetect.OS;
			},
			language: function() {
				try{return navigator.language;}
				catch(e) {return false;};

				try{return navigator.userLanguage;}
				catch(e) {return false;};

				try{return navigator.systemLanguage;}
				catch(e) {return false;};
			},
			visited: function() {
				var visited = exploitVisited();
				if (!visited.length) {
					return false;
				}
				var $visited = $('<div/>').slice(1);
				$.each(visited, function() {
					Array.prototype.push.call($visited, $('<dd></dd>').text(this.toString())[0]);
				});
				return $visited;
			}
		};

		for (var id in fill) {
			var val = fill[id](), $el = $('#'+id);
			if (typeof val == 'object') {
				$el.replaceWith(val);
			} else if (val) {
				$el.text(val);
			}
		}
		$('dd:contains(N/A)').each(function() {
			var $this = $(this);
			$this.add($this.prev()).add($this.prev().prev()).remove();
		});
		$dts = $('#items dt:not(.separator)').hide();
		$dds = $('#items dd').hide();
		
		var queue = {
			queue: [],
			current: null,
			time: null,
			add: function(fn) {
				queue.queue.push(fn);
			},
			start: function(interval) {
				queue.current = queue.queue.shift();
				queue.timer = setTimeout(function() {
					var r = queue.current(), done = (r === false || typeof r === 'undefined');
					if (done && !queue.queue.length) {
						return;
					}
					if (done) {
						queue.current = queue.queue.shift();
					}
					var customInterval = false;
					if (typeof r == 'object' && typeof r[0] == 'function') {
						queue.current = r[0];
						customInterval = r[1] || customInterval;
					}
					setTimeout(arguments.callee, customInterval || interval);
				}, interval);
			}
		};
		
		queue.add(function() {
			var $dt = $(Array.prototype.shift.call($dts)), $dd = $dt.next(), text = $dd.text();
			$dt.css('display', 'block');

			$dd
				.text('detecting ...')
				.css('display', 'block');
			if ($dts.length) {
				queue.queue.unshift(arguments.callee);
			}
			return [function() {
				$dd.text(text);
				while (($dd = $dd.next()) && $dd.is('dd')) {
					(function($dd) {
						queue.queue.unshift(function() {
							$dd.css('display', 'block');
						});
					})($dd);
				}
			}, 500];
		});
		queue.add(function() {
			$('#daten').show();
		});
		queue.add(function() {
			$('#page').show();
		});
		queue.start(500);
	});

	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: "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: "Microsoft Internet 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: "Macintosh"
			},
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}
		]

	};
	BrowserDetect.init();
})(__jQuery__);