function MenuLayer(menu, id, li) {
	this.menu = menu;
	this.id = id;
	this.layer = li;
	this.parent = null;
	this.hideTimer = null;
	this.show = function () {
		clearTimeout(this.hideTimer);
		this.hideTimer = null;
		if (this.menu.onshow) this.menu.onshow(this.id);
		sE(this.layer);
		if (this.parent) {
			this.parent.show();
		}
	}
	this.hide = function () {
		if (this.menu.onhide) this.menu.onhide(this.id);
		hE(this.layer);
	}
}

function Menu(vn, ip, lp, t) {
	// настройки
	this._varname = vn;
	this.itemPrefix = ip;
	this.layerPrefix = lp;

	this.NSresized = false;
	this.timeout = t || 50;
	this.items = {};
	
	// инициализация
	this.loader = this.menuLoc = window;

	// для NN4 begin
	if (l){
		this.origWidth = this.loader.innerWidth;
		this.origHeight = this.loader.innerHeight;
	}
	// для NN4 end

	this.redo = function () {
		// для NN4 begin
		if (l){
			if (this.loader.innerWidth==this.origWidth && this.loader.innerHeight==this.origHeight) return;
			this.NSresized = true;
			this.menuLoc.location.reload();
		}
		// для NN4 end
		this.items = {};
	}

	if (this.loader.onresize) this._old_onresize = this.loader.onresize;
	this.loader.onresize = eval("new Function('"+this._varname+".redo()')");

	this.popup = function (id, pos) {
//		if (l && this.NSresized) this.init();
		this.popMenu(id, pos);
	}

	this.popMenu = function (id, pos) {
		this.show(id, pos);
	}

	this.popdown = function (id) {
		var i = this.items[id];
		if (!i) return;

		this.hide(id);
	}

	this.over = function (id) {
		this.items[id].show();
	}

	this.out = function (id) {
//		if (a) {
//			var theEvent = this.menuLoc.event;
//			if (theEvent.srcElement.contains(theEvent.toElement)) return;
//		}
		this.hide(id);
	}

	this.itemover = function (id, pos) {
		this.show(id, pos);
	}

	this.itemout = function (id) {
		var i = this.items[id];
		if (!i) return;

		i.hideTimer = setTimeout(this._varname+".items["+id+"].hide()", this.timeout);
	}

	this.show = function (id, pos) {
		var i = this.items[id];
		if (!i) {
			var li = gE(this.layerPrefix+id);
			if (!li) return;
			i = this.items[id] = new MenuLayer(this, id, li);
			var mi = li = gE(this.itemPrefix+id);
			while (li=gP(li)) {
				if (li.tagName=='DIV' && li.id.indexOf(this.layerPrefix)==0) {
					i.parent = this.items[li.id.match(/\d+/)[0]];
					break;
				}
			}
			switch (pos) {
				case 'below':
					sX(i.layer, gXg(mi));
					sY(i.layer, gYg(mi)+gH(mi));
					break;
				case 'below_lefted':
					sX(i.layer, gXg(gE(this.firstmenu)));
					sY(i.layer, gYg(mi)+gH(mi));
					break;
				case 'right':
					sX(i.layer, gXg(mi)+gW(mi));
					sY(i.layer, gYg(mi)-1);
					break;
				case 'right_bounded':
					sX(i.layer, gXg(mi)+gW(mi)+1);
					var dy = gYg(mi) + gH(i.layer) - gYg(gE(this.lastmenu)) - gH(gE(this.lastmenu));
					var dh = gH(i.layer) - (gYg(gE(this.lastmenu)) + gH(gE(this.lastmenu)) - gYg(gE(this.firstmenu)));
					var tp = gYg(mi)+gH(mi)-gH(i.layer);
					if (tp < gYg(gE(this.firstmenu))) {
						tp = gYg(gE(this.firstmenu));
					}
					sY(i.layer, dh > 0 ? gYg(gE(this.firstmenu)) : dy > 0 ? tp : gYg(mi));
					break;
				case 'left':
					sX(i.layer, gXg(mi)-gW(mi));
					sY(i.layer, gYg(mi)-1);
					break;
				case 'leftup':
					// leftup_bounded
					sX(i.layer, gXg(mi)-gW(i.layer)-3);
					var y = gYg(mi)-1-gH(i.layer)+gH(mi);
					sY(i.layer, y < gYg(gE(this.firstmenu)) ? gYg(mi)-1 : y);
					break;
			}
		}
		i.show();
	}
	
	this.hide = function (id) {
		var i = this.items[id];
		if (i) {
			i.hideTimer = setTimeout(this._varname+".items["+id+"].hide()", this.timeout);
			if (i.parent) {
				this.hide(i.parent.id);
			}
		}
	}
}

