var menus = [],
aMenu = window.external ? [' style="width:100%;height:100%"', 'div onclick="', 'div'] : ['', 'a href="javascript:', 'a'],
gMenuGetElem = document.getElementById
	? function(sId) { return document.getElementById(sId) }
	: function(sId) { return document.all[sId] };

function menu(aFields, oCfg) {
	var _ = this, i;
	_.aFields = aFields;
	_.oCfg = oCfg;
	_.sPath = '';
	_.id = menus.length;
	_.aAll = [];
	_.aKids = [];
	_.aOffset = [0, 0];
	
	_.oCfg[-1] = {
		'firstX' : 20,
		'firstY' : 20,
		'nextX' : 15,
		'nextY' : 15,
		'width' : 100,
		'height' : 22,
		'hideAfter' : 200,
		'target' : '_self',
		'trace' : 0,
		'css' : ''
	};
	
	for (i = 0; i < _.aFields.length; i++)
		if (_.aFields[i])
			new gMenuItem(0, _, _, _.aFields[i]);
	for (i = 0; i < _.aKids.length; i++)
		gItemShow(_.aKids[i], 1);
	menus[_.id] = _;
}

function gMenuHide (mId) {
	var i, a = menus[mId].aAll;
	for (i = 0; i < a.length; i++) {
		gItemShow(a[i], 0);
		gItemTrig(a[i],'norm');
	}
}

function gMenuOnclick (mId, iId) {
	var m = menus[mId], _ = m.aAll[iId].aFields[1];
	gItemTrig(m.aAll[iId], 'clck');
	if (_) open(_, gItemCfg(m.aAll[iId].depth, m.oCfg, 'target'));
}

function gMenuOnmouseout (mId, iId) {
	var m = menus[mId];
	m.nHideTimer = setTimeout('gMenuHide('+ mId +')', gItemCfg(m.oActiveItem.depth, m.oCfg, 'hideAfter'));
	if (m.oActiveItem.id == iId)
		m.oActiveItem = null;
}

function gMenuOnmouseover (mId, iId) {
	var m = menus[mId], _, bVisib, i;
	m.oActiveItem = _ = m.aAll[iId];
	if (m.nHideTimer) clearTimeout(m.nHideTimer);
	
	for (i = 0; i < m.aAll.length; i++) {
		_ = m.aAll[i];
		bVisib = !m.oActiveItem.sPath.indexOf(_.sPathShort);
		if (bVisib)
			gItemTrig(_, _ == m.oActiveItem ? 'over' : 'norm');
		gItemShow(_, bVisib);
	}
	if (m.oActiveItem.bTrace)
		for (i = m.oActiveItem; i && i.aRefs; i = i.oParent)
			gItemTrig(i, 'over');
}

// --- menu item Class ---
function gMenuItem (l, p, m, aFields) {
	var _ = this, i, c = p.aKids.length, oCfg = m.oCfg;
	_.aFields = aFields;
	_.oParent = p;
	_.sPathShort = p.sPath;
	_.sPath = p.sPath + c + ':';
	_.depth = l;
	
	_.id = m.aAll.length;
	m.aAll[_.id] = _;
	p.aKids[c] = _;

	var id = m.id + ',' + _.id, nX, nY;
	_.bTrace = gItemCfg(l, oCfg, 'trace');
	
	for (i = l; i >= -1; i --) {
		if (oCfg[i] && oCfg[i]['nextX'] != null)
			nX = oCfg[i]['nextX'];
		if (oCfg[i] && oCfg[i]['nextY'] != null)
			nY = oCfg[i]['nextY'];
		if (nX != null || nY != null)
			break;
	}

	_.aOffset = [
		p.aOffset[0] + gItemCfg(l, oCfg, 'firstX') + (nX != null ? nX * c + gItemCfg(l, oCfg, 'width') * c : 0),
		p.aOffset[1] + gItemCfg(l, oCfg, 'firstY') + (nY != null ? nY * c + gItemCfg(l, oCfg, 'height') * c : 0)
	];
	document.write('<', aMenu[1], 'gMenuOnclick(', id, ')" id="me', id, '" style="position:absolute;top:', _.aOffset[1], 'px;left:', _.aOffset[0], 'px;width:', gItemCfg(l, oCfg, 'width'), 'px;height:', gItemCfg(l, oCfg, 'height'), 'px;visibility:hidden;z-index:', l, ';text-decoration:none" onmouseout="gMenuOnmouseout(', id, ')" onmouseover="gMenuOnmouseover(', id, ')"><div', aMenu[0], ' id="mi', id, '" class="', gItemCfg(l, oCfg, 'css'), 'norm">', aFields[0], '</div></', aMenu[2], '>');
	_.aRefs = [gMenuGetElem('me' + m.id + ',' + _.id), gMenuGetElem('mi' + m.id + ',' + _.id), gItemCfg(l, oCfg, 'css')];

	if (aFields.length > 2) {
		_.aKids = [];
		for (i = 2; i < aFields.length; i++)
			if (aFields[i])
				new gMenuItem(l + 1, _, m, aFields[i]);
	}
}

function gItemShow(_, is_visible) {
	if (_.oVisible == is_visible) return;
	_.oVisible = is_visible;
	if (is_visible)
		_.aRefs[0].style.visibility = 'visible';
	else if (_.depth)
		_.aRefs[0].style.visibility = 'hidden';
}

function gItemTrig(_, nState) {
	if (_.aRefs[3] == nState) return;
	_.aRefs[3] = nState;
	_.aRefs[1].className = _.aRefs[2] + nState
}

function gItemCfg(l, oCfg, k) {
	for (var i = l; i >= -1; i --)
		if (oCfg[i] && oCfg[i][k] != null)
			return oCfg[i][k];
}

