	function layer(l, t, r, b) { var o = new Layer(r - l); o.visibility = "visible"; o.left = l; o.top = t; o.clip.width = r - l; o.clip.height = b - t; o.zIndex = 1; o.onmouseover = hideAll; return o; }
	function hideAll() { destroyCaptures(); hideMenus(menu.name, false); }
	function destroyCaptures() { if(menu.captures != null) { for(var i = 0; i<menu.captures.length; i++) { menu.captures[i].visibility = "hidden"; delete menu.captures[i]; } menu.captures = null; } }
	function createCaptures() { if(menu.captures == null) { menu.captures = new Array (layer( 0,0, menu.clientAreaWidth, menu.top),layer(0,0,menu.left,menu.clientAreaHeight),layer(menu.right,0,menu.clientAreaWidth,menu.clientAreaHeight),layer(0,menu.bottom,menu.clientAreaWidth,menu.clientAreaHeight)); } }
	function controlMenu() { if(!menu.builded || document.all && document.body.clientWidth != menu.windowWidth) { resizeMenu(); } }
	function getStyleObj(obj) { return (document.layers) ? obj : (obj ? obj.style : null); }
	function getObj(parentObj, name) { return ( document.layers ? ( parentObj ? parentObj.document.layers[name] : document.layers[name] ) : ( document.all ? document.all[name] : document.getElementById(name) ) ); }
	function resizeMenu() { 
		hideMenus(menu.name, false);
		positionMenu();
		menu.visibles = new Array();
		menu.visibles[0] = menu.name;
		menu.builded = true;
		if(document.all == null || document.loaded) { window.onresize = resizeMenu; }
		if(document.layers) { destroyCaptures(); }
	}
	
	function getPosition(theObj) {
		var p = new Object();
		var lt = "#DIV#TABLE#TD#";
		var tt ="#DIV#TABLE#TR#";
		p.top = p.left = 0;
		do {
			if(lt.indexOf("#" + theObj.tagName + "#") != -1) { p.left += theObj.offsetLeft;}
			if(tt.indexOf("#" + theObj.tagName + "#") != -1) { p.top += theObj.offsetTop;}
			theObj = theObj.parentElement;
		} while(theObj);
		return p;
	}
	function positionMenu() {
		if(document.all) {
			var theObj = getObj(null, menu.name + "Bar");
			var p = getPosition(theObj);
			menu.top = p.top;
			menu.left = p.left;
			menu.windowWidth = document.body.clientWidth;
		} else if(document.layers) {
			var i = 0;
			var l;
			var f;
			menu.right = 0;
			menu.bottom = 0;
			for(var i = 0; (l = document.layers[menu.name + "BarItem" + i]); i++)  {
				if(i == 0) {
					f = l;
				} else if(i == 1) {
					var spacing = ( l.pageX == f.pageX ? l.pageY - f.pageY - f.clip.height : l.pageX - f.pageX - f.clip.width )/2;
					menu.left = f.pageX - spacing;
					menu.top = f.pageY - spacing;
				}
				menu.right = Math.max(l.pageX + l.clip.width, menu.right);
				menu.bottom = Math.max(l.pageY + l.clip.height, menu.bottom);
			} while(l);
			menu.clientAreaWidth = window.innerWidth; 
			if(menu.clientAreaWidth < menu.right) {
				menu.clientAreaWidth = menu.right + 7;
			}
			menu.clientAreaHeight = window.innerHeight; 
			if(menu.clientAreaHeight < menu.bottom) {
				menu.clientAreaHeight = menu.bottom + 7;
			}
		} else if(document.getElementById) {
			if(menu.align == "center") {
				menu.left += Math.max( (window.innerWidth - menu.bodyWidth)/2 , 0 );
			} else if(menu.align == "right") {
				menu.left += Math.max( window.innerWidth - menu.bodyWidth , 0 );
			}
			document.getElementById(menu.name + "Bar").addEventListener("mouseover", controlMenuBarArea, false);
		}

	}

	function captureOff(e) { menu.capturing = false; controlClientArea(e); }
	function showMenu(event, menuName) {
		controlMenu(); 
		var pos = menuName.lastIndexOf("|");
		var parent, lft, tp;
		if(pos != -1) {
			parent = menuName.substring(0, pos);
			hideMenus(parent, false);
		}
		if(parent.indexOf("|") == -1) {
			index = menuName.substring(pos + 1);
			if(document.layers) {
				var bar = document.layers[menu.name + "BarItem" + index];
				lft = bar.pageX+menu.mainOffsetX;
				tp = bar.pageY +menu.mainOffsetY;
			} else if(document.all) {
                                var theObj = getObj(null, menu.name + "BarItem" + index);
				var p = getPosition(theObj);
				lft = p.left+menu.mainOffsetX;
				tp = p.top + menu.mainOffsetY;
			} else if(document.getElementById) {
				index = parseInt(index);
				lft = menu.left + (index % menu.cols) * menu.colWidth+menu.mainOffsetX;
				tp = menu.top + (Math.floor(index / menu.cols) + 1) * menu.rowHeight + menu.mainOffsetY;
			}
		} else {
			lft = menu.itemOffsetX;
			tp = menu.itemOffsetY;
			if(document.layers) {
				tp += document.layers[parent].document.layers["cell" + menuName].pageY;
				lft += document.layers[parent].document.layers["cell" + menuName].pageX;
			} else if(document.all) {
				tp += document.all[parent].style.pixelTop + document.all["cell" + menuName].offsetTop;
				lft += document.all[parent].style.pixelLeft;
			} else if(document.getElementById) {
				var parentObj = document.getElementById(parent);
				tp += parseInt(parentObj.style.top);
				lft += parseInt(parentObj.style.left);
				var trList = parentObj.getElementsByTagName("TR");
				for(var i = 0; i < trList.length; i++) {
					var trObj = trList.item(i);
					if(trObj.id != "cell" + menuName) {
						if(trObj.id) {
							var itsHeight = trObj.getAttribute("offsetHeight");
							tp += (itsHeight) ? itsHeight : menu.menuItemHeight;
						}
					} else {
						break;
					}
				}
				
			}
		}
		var theObj = getObj(null, menuName);
		var obj = getStyleObj(theObj);
		if(obj) {
			obj.left = lft;
			obj.top = tp;
			obj.zIndex = menuName.length + 117;
			obj.visibility = "inherit";			
			menu.visibles[menu.visibles.length] = menuName;
			if(document.all) {
				if(!document.getElementById) { obj.pixelWidth = theObj.all.item(0).offsetWidth; }
				window.event.cancelBubble = true;
				theObj.onmouseover = controlClientArea;
			} else if(document.layers) {
				menu.capturing = true;
				event.target.onmouseout = captureOff;
				theObj.onmouseover = controlClientArea;
				createCaptures();
			} else if(document.getElementById) {
				document.getElementById(menuName).addEventListener("mouseover", controlMenuItemArea, false);
			}
		}

		return false;
	}
	
	function controlClientArea(e) {
		controlMenu();
		if(document.all) {
			var obj = window.event.srcElement;
			do {
				if(obj.id && typeof(obj.id) == "string") {
					var popedup = obj.id.lastIndexOf(menu.name + "|");
					if(obj.id == menu.name + "Bar" ||  popedup == 0) {
						hideMenus(obj.id, false);
						return true;
					}
				}
				obj = obj.parentElement;
			} while(obj); 
			hideMenus(menu.name, false);
		} else if(document.layers) {
			if(menu.capturing) {
				return true;
			}
			for(var i = menu.visibles.length - 1; i>0; i--) { 
				var theObj = getObj(null, menu.visibles[i]);
				var b = theObj.pageY + theObj.clip.height - 1;
				var r = theObj.pageX + theObj.clip.width - 1;
				if(e.pageX <= r && e.pageX >= theObj.pageX && e.pageY >= theObj.pageY && e.pageY <= b) {
					hideMenus(menu.visibles[i], false);
					return true;
				}
			}
			if(e.pageX > menu.right || e.pageX < menu.left || e.pageY < menu.top || e.pageY > menu.bottom) {
				hideMenus(menu.name, false);
			}
		} else if(document.getElementById) {
			hideMenus(menu.name, false);
		}
		return true;
	}

	function controlMenuBarArea(e) { // Netscape 6
		e.stopPropagation();
	}

	function controlMenuItemArea(e) { // Netscape 6
		e.stopPropagation();
		node = e.target;
		do {
			if(node.nodeName == "A" && node.getAttribute("captured")) {
				return true;
			} else {
				node = node.parentNode;
			}
		} while(node && node.nodeName != "DIV");
		hideMenus(e.currentTarget.getAttribute("id"), false);
		return true;
	}


	function hideMenus(family, removeParent) { // menu_i_  j _ k menu_i
		if(menu.builded) {
			var a = new Array();
			for(var i = 0; i < menu.visibles.length; i++) {
				var j = (removeParent ? i : i+1);
				if(menu.visibles[i] == family) {
					for(i = 0; i < j; i++) {
						a[i] = menu.visibles[i];					
					}
					for(; j < menu.visibles.length; j++) {
						getStyleObj(getObj(null, menu.visibles[j])).visibility = "hidden"; 
					}
					menu.visibles = a;
					break;
				}
			}
		}
	}