if(browser.nn4){
	window.captureEvents(Event.MOUSEMOVE|Event.MOUSEDOWN);
	window.onmousemove=doMove;
	window.onmousedown=doClick;
}else{
	document.onmousemove=doMove;
	document.onmousedown=doClick;
}

var visibleLayer;
var layer2show;
timerOff = new Array();
timerOn = new Array();

function doMove(nn_event){
	e=(document.all) ? event : nn_event;
	if(visibleLayer){
		mx = (document.layers) ? e.pageX : (window.opera) ? e.clientX : e.clientX+document.body.scrollLeft;
		my = (document.layers) ? e.pageY : (window.opera) ? e.clientY : e.clientY+document.body.scrollTop;
//		window.status = 'mx='+mx+'; my='+my;
		lx = realPositionX(visibleLayer);
		ly = realPositionY(visibleLayer);
		lw = (browser.nn4) ? document.layers[visibleLayer].clip.width : document.getElementById(visibleLayer).offsetWidth;
		lh = (browser.nn4) ? document.layers[visibleLayer].clip.height : document.getElementById(visibleLayer).offsetHeight;
		if(mx>lx+145 && my<ly+38){
			hideSubmenu();
		}else{
			if( mx < lx || my < ly || mx > lx+lw || my > ly+lh ){
				if(!timerOff[visibleLayer]){
					timerOff[visibleLayer] = setTimeout('hideSubmenu()', 800);
				}
			}else{
				if(timerOff[visibleLayer]){
					clearTimeout(timerOff[visibleLayer]);
					timerOff[visibleLayer]=null;
				}
			}
		}
	}
}

function doClick(nn_event){
	if(visibleLayer){
		// если какое то подменю в данный момент показывается
		// И если объект по, которому кликнули (или любой из его родителей) не является подменю
		// то скрываем подменю немедленно
		e=(document.all) ? event : nn_event;
		elem=(document.all) ? e.srcElement : e.target;
		while(elem.offsetParent != null){
			if(elem.id == visibleLayer)break;
			elem = elem.offsetParent;
			if(elem.tagName == 'BODY'){
				hideSubmenu();
				break;
			}
		}
	}
}

function realPositionX(which){
	if (browser.nn4) {
		pos = document.layers[which].pageX
	} else {
		var elem = (browser.ie4) ? document.all[which] : document.getElementById(which);
		var pos = elem.offsetLeft;
		while (elem.offsetParent != null) {
		elem = elem.offsetParent;
		pos += elem.offsetLeft;
		if (elem.tagName == 'BODY') break;
		}
	} return pos;
}

function realPositionY(which) {
	if (browser.nn4) {
		pos = document.layers[which].pageY
	} else {
		var elem = (browser.ie4) ? document.all[which] : document.getElementById(which);
		var pos = (elem.offsetTop>0)?elem.offsetTop-2:0; // - эта хитрая строчка позволяет обмануть сразу оперу и мозиллу: мозилле присвоится ее собственное значение > 0,  взятое с Tунv; опере присвоится 0 вместо ее собственного значени  < 0
		while (elem.offsetParent != null) {
		elem = elem.offsetParent;
		pos += elem.offsetTop;
		if (elem.tagName == 'BODY') break;
		}
	} return pos;
}

function showSubmenu(name){
	if(visibleLayer){
		hideSubmenu();
	}
	getLayerStyle(name).visibility = (browser.nn4) ? 'show' : 'visible';
	visibleLayer = name;
}

function doShowSubmenu(name){
	if(!timerOn[name]){
		if(layer2show){
			clearTimeout(timerOn[layer2show]);
			timerOn[layer2show]=null;
		}
		layer2show=name;
		timerOn[layer2show] = setTimeout('showSubmenu("' + layer2show + '")', 200);
	}
}

function hideSubmenu(){
	if(visibleLayer){
		getLayerStyle(visibleLayer).visibility = (browser.nn4) ? 'hide' : 'hidden';
		clearTimeout(timerOff[visibleLayer]); clearTimeout(timerOn[visibleLayer]);
		timerOff[visibleLayer]=null; timerOn[visibleLayer]=null;
		visibleLayer = null;
	}
}

function getLayerStyle(layer){
	if(browser.nn4){
		layerObj = document.layers[layer];
	}else{
		if(browser.dom){
			layerObj = document.getElementById(layer).style;
		}else{
			layerObj = document.all[layer].style;
		}
	}
	return layerObj;
}
