jQuery.fn.ddmenu = function(opts) {

	function showElementQuick(menu, el) {
		if (el) {
			el.data("subnav").show();
			el.addClass("over");
			menu.data("visible", el);
		}
	}

	function showElement(menu,el) {
		if (el) {
			el.data("subnav").show();
			el.addClass("over");
			menu.data("visible", el);
		}
	}

	function hideElement(menu,el) {
		if (el) {
			el.data("subnav").hide();
			el.removeClass("over");
			menu.removeData("visible");
		}
	}

	function openMenu(menu,el) {
		if (menu.data("visible") != el) {
			closeMenu(menu);
			showElement(menu,el);
		}
	}

	function closeMenu(menu) {
		cancelTimer(menu);
		hideElement(menu, menu.data("visible"));
	}

	function exitMenu(menu) {
		var vis = menu.data("visible");
		var cur = menu.data("current");
		if(vis != cur) {
			hideElement(menu, vis);
			if (cur) {
				showElement(menu,cur);
			}
		}
	}

	function startTimer(menu) {
		menu.data("timer", setTimeout(function() { exitMenu(menu); }, 500));
	}

	function cancelTimer(menu) {
		var t = menu.data("timer");
		if(t) {
			window.clearTimeout(t);
			menu.removeData("timer");
		}
	}


	// Nur einzelne Elemente können zu einer Navigatin gemacht werden
	if (this.size() == 1) {
		var menu = this;

		$('.level1', menu).each(function(i,el) {
			el = $(el);

			var subnav = el.next("div");
			el.data("subnav", subnav);

			el.mouseover(function() { return openMenu(menu,el); });
			el.mouseout(function() { return startTimer(menu); });
			el.click(function(e) { e.stopPropagation(); });

			if (subnav.size() > 0) {
				subnav.mouseover(function() { cancelTimer(menu); });
				subnav.mouseout(function() { startTimer(menu); });
				subnav.click(function(e) { e.stopPropagation(); });
			}

		});

		if (opts.current) {
			var cur = $(opts.current);
			menu.data("current", cur);
			showElementQuick(menu, cur);
		}

		$(document).click(function() { exitMenu(menu) });
	}
};