function llx3_dhtmlMenu(menuElement, parentElement, direction) {
	var This = this;
	if (direction == undefined) direction = 'vertical';
	$(parentElement).mouseenter(function() { This.showMenu() });
	$(menuElement).mouseenter(function() { This.showMenu() });
	$(parentElement).mouseleave(function() { This.hideMenuDelayed() });
	$(menuElement).mouseleave(function() { This.hideMenuDelayed() });
	$(menuElement).css({ 'position': 'absolute', 'display': 'none' });
	var tOut = 0;
	this.subMenuClassName = '';
	this.closeDelay = 250;
	this.mainMenuItem = undefined;
	this.baseZindex = 10000;
	this.hAlign = 'left';
	this.elements = new Array();
	this.menuElement = $(menuElement).get(0);
	this.effect = 'none'; //fade
	var Positioned = false;

	this.showMenu = function() {
		if (Positioned == false) return false;
		if (This.onShowMenu() == false) return false;
		if (($(menuElement).css('display') == 'none') || (tOut != 0)) {
			clearTimeout(tOut);
			BringToFront();
			switch (direction) {
				case 'vertical':
					$(menuElement).css({ 'top': $(parentElement).offset().top + $(parentElement).height() + 'px' });
					$(menuElement).css({ 'left': $(parentElement).offset().left + 'px' });
					if (This.hAlign == 'center') { $(menuElement).css({ 'left': $(parentElement).offset().left + ($(parentElement).width() / 2) - ($(menuElement).width() / 2) + 'px' }); }
					show();
					break;
			}
			hideOthers($(menuElement).get(0));
		}
		function show() {
			switch (This.effect) {
				case 'fade':
					$(menuElement).fadeIn(200)
					break;
				default:
					$(menuElement).css({ 'display': 'block' });
					break;
			}
		}
	}
	this.onShowMenu = function() { return true; }

	this.hideMenu=function() {
		if (This.onHideMenu() == false) return false;
		$(menuElement).css({ 'display': 'none' });
		SendToBack();
	}
	this.hideMenuDelayed = function() {
		if (This.onHideMenu() == false) return false;
		tOut = setTimeout(function() {
			$(menuElement).css({ 'display': 'none' });
			SendToBack();
		}, This.closeDelay);
	}	
	this.onHideMenu = function() { return true; }

	function hideOthers(el) {
		if (This.mainMenuItem == undefined) return true;
		var elmts = new Array();
		elmts.push(el);
		while (el != This.mainMenuItem.menuElement) { el = el.parentNode;if (Contains(This.elements, el)) { elmts.push(el); }  }
		var i = 0;
		for (i = 0; i < This.mainMenuItem.elements.length; i++) {
			if (Contains(elmts,This.mainMenuItem.elements[i])==false) { $(This.mainMenuItem.elements[i]).css({ 'display': 'none' }); }
		}
	}

	function Contains(a,o) {
		var i = 0;
		for (i = 0; i < a.length; i++) {if (a[i] == o) return true; }
		return false;
	 }

	function BringToFront() {
		var zi = 0;
		$('*').each(function(s) { if (this.style.zIndex > zi) zi = this.style.zIndex; });
		if (zi < This.baseZindex) zi = This.baseZindex;
		$(menuElement).css({ 'zIndex': zi + 1 });
	}
	function SendToBack() { $(menuElement).css({ 'zIndex': 0 }); }

	this.init = function() {
		$('*').each(function(s) { if (This.baseZindex < this.style.zIndex) This.baseZindex = this.style.zIndex + 1; });
		var cn = this.subMenuClassName;
		setTimeout(SetPos, 500);
		//AddEvent(window, "load", function() { SetPos() });
		if (cn == '') return true;
		var pm = this;
		$(menuElement).find('.' + cn).each(function(s) { var m = new ppMenu(this, this.parentNode, 'horizontal'); m.mainMenuItem = pm; This.elements.push(this) })
		$(menuElement).find('*').each(function(s) { if (this.title == '') this.title = ''; });
	}

	function SetPos() {
		try { document.body.appendChild(This.menuElement); Positioned = true; return true; } catch (e) { }
		setTimeout(SetPos, 100);
	}
	

	function AddEvent(obj, name, handler) {
		if (navigator.appName.indexOf("Microsoft") != -1) {
			obj.attachEvent('on' + name, handler);
		} else {
			obj.addEventListener(name, handler, true);
		}
	}
	
}
