//////////////////////////////////////////////
// menu.js
//
// David Yang (yang@synda.com)
// 2003.10.14
//////////////////////////////////////////////

var oCurNode;

function menu_btnMouseOver(iStyle, iPulldownWay)
{
	var t = menu_getParent(window.event.srcElement);
	if (t.getAttribute('CURMNODE') == '1') {
		return;
	}

	if (t.tagName == 'SPAN' && t.getAttribute('MALTPIC') != null) {
		var e = window.event.srcElement;
		var sImage = e.getAttribute('MALTPIC');
		if (sImage != null) {
			e.setAttribute('MALTPIC', e.src);
			e.src = sImage;
		}
	}
	else {
		var xColor = t.getAttribute('HCOLOR');
		if (xColor.length > 2) {
			t.style.backgroundColor = xColor;
		}
		else {
			t.style.backgroundColor = '';
		}
	}

	if (iStyle == 0 && iPulldownWay == 0) {
		if (t.tagName == 'SPAN') {
			menu_showMenu(t.getAttribute('SUBNODE'), 0, t.getAttribute('SHADOW'), t.getAttribute('BCOLOR'));
		}
		else if (t.getAttribute('RIGHTARROW') == '1') {
			menu_showMenu(t.getAttribute('SUBNODE'), 1, t.getAttribute('SHADOW'), t.getAttribute('BCOLOR'));
		}
	}
}

function menu_btnMouseOut(iStyle, iPulldownWay)
{
	var e = menu_getParent(window.event.fromElement);
	var t = menu_getParent(window.event.toElement);
	if (e == null || t == null || (e == t && window.event.fromElement.tagName != 'IMG')) {
		return;
	}
	if (e.getAttribute('CURMNODE') == '1') {
		return;
	}

	if (e.tagName == 'SPAN' && e.getAttribute('MALTPIC') != null) {
		var x = window.event.fromElement;
		var sImage = x.getAttribute('MALTPIC');
		if (sImage != null) {
			x.setAttribute('MALTPIC', x.src);
			x.src = sImage;
		}
	}
	else {
		var xColor = e.getAttribute('LCOLOR');
		if (xColor.length > 2) {
			e.style.backgroundColor = xColor;
		}
		else {
			e.style.backgroundColor = '';
		}

		if (e != t && e.tagName != 'SPAN' && e.getAttribute('RIGHTARROW') == '1') {
			var oNode = eval(e.getAttribute('SUBNODE'));
			if (oNode != menu_topNode(t)) {
				oNode.style.display = 'none';
				menu_clearShadow(oNode);
			}
		}
	}
}

function menu_btnClick(iStyle, iPulldownWay, sNode, sURL)
{
	try {
		var e = menu_getParent(window.event.srcElement);

		var isPrivate = e.getAttribute('PRIVATE');
		var isWarning = e.getAttribute('WARNING');
		var iBranchNoLink = e.getAttribute('BRANCHNOLINK');

		if (isPrivate == '1') {
			var cno = parseInt(sURL.substr(sURL.indexOf('cid=') + 'cid='.length));
			if (! isNaN(cno)) {
				var wid = e.getAttribute('WID');
				var r = hasAccessRights(wid, 'menu', cno);
				if (! r && isWarning == '1') {
					alert('对不起，您没有访问权限！');
					return;
				}
			}
		}

		if (iPulldownWay == 1 && iBranchNoLink == '1') {
			if (e.tagName == 'SPAN') {
				menu_showMenu(sNode, 0, e.getAttribute('SHADOW'), e.getAttribute('BCOLOR'));	// pulldown
				return;
			}
			if (menu_topNode(e).tagName == 'DIV' && e.getAttribute('RIGHTARROW') == '1') {
				menu_showMenu(sNode, 1, e.getAttribute('SHADOW'), e.getAttribute('BCOLOR'));	// pullright
				return;
			}

			menu_setCurrentNode(e);
			if (e.tagName == 'TR') {
				var d = e.cells[e.cells.length-1];
				var iNodeTag = d.getAttribute('NODETAG');
				var sNodeType = d.getAttribute('NODETYPE');
				if (iNodeTag == '1') {
					var dd = e.cells[0];
					var sImgElement = dd.innerHTML;
					var oImg = dd.firstChild;
					if (typeof(oImg) == 'object' && oImg.getAttribute('NODETYPE') == 'COLLAPSE') {
						dd.innerHTML = dd.getAttribute('MALTPIC');
						dd.setAttribute('MALTPIC', sImgElement);
					}
					if (typeof(oImg) == 'object' && oImg.getAttribute('NODETYPE') == 'EXPAND') {
						dd.innerHTML = dd.getAttribute('MALTPIC');
						dd.setAttribute('MALTPIC', sImgElement);
					}
				}

				switch (sNodeType) {
				case 'EXPAND':
					menu_collapseTree(sNode);
					d.setAttribute('NODETYPE', 'COLLAPSE');
					return;
				case 'COLLAPSE':
					menu_expandTree(sNode);
					d.setAttribute('NODETYPE', 'EXPAND');
					return;
				}
			}
		}

		if (iBranchNoLink == '0') {
			if (sNode != '') {
				if (sURL.indexOf('\?') > 0) {
					sURL += '&node=' + sNode;
				}
				else {
					sURL += '\?node=' + sNode;
				}
			}
			window.navigate(sURL);
		}
	}
	catch (e) {
		alert('Error: ' + e.description);
	}
}

function menu_topNode(oNode)
{
	var tNode = oNode;
	if (tNode != null) {
		while (tNode.tagName == 'IMG' || tNode.tagName == 'FONT' || tNode.tagName == 'TD' || tNode.tagName == 'TR' || tNode.tagName == 'TBODY' || tNode.tagName == 'TABLE') {
			tNode = tNode.parentElement;
		}
	}

	return tNode;
}

function menu_init()
{
	document.body.attachEvent('onmousemove', menu_hideMenu);
}

function menu_showMenu(sNode, popupWay, bShadow, sBorderColor)
{
	try {
		var oNode = eval(sNode);
		if (typeof(oNode) != 'object' || ! oNode || oNode.style.display == '') {
			return;
		}

		tNode = menu_getParent(window.event.srcElement);

		var h = tNode.offsetHeight;
		var w = tNode.offsetWidth;
		var l = tNode.offsetLeft;
		var t = tNode.offsetTop;

		switch (popupWay) {
		case 0:
			t += h + 4;
			break;
		case 1:
			l += w;
			break;
		}
		vParent = tNode.offsetParent;
		while (vParent.tagName.toUpperCase() != 'BODY')
		{
			l += vParent.offsetLeft;
			t += vParent.offsetTop;
			vParent = vParent.offsetParent;
		}


		oNode.style.top = t;
		oNode.style.left = l;
		oNode.style.zIndex = menu_topNode(tNode).style.zIndex + 1;
		oNode.style.display = '';

		if (bShadow == 'true') {
			menu_makeShadow(oNode.firstChild, sBorderColor, 4);
		}

		oCurNode = oNode;
	}
	catch (e) {
	}
}

function menu_getParent(oNode)
{
	var tNode;

	tNode = oNode;
	if (oNode != null) {
		switch (oNode.tagName) {
		case 'TD':
			tNode = oNode.parentElement;
			break;
		case 'IMG':
			tNode = oNode.parentElement;
			if (tNode.tagName != 'SPAN')
				tNode = tNode.parentElement;
			break;
		case 'FONT':
			tNode = oNode.parentElement.parentElement;
			break;
		}
	}

	return tNode;
}

function menu_hideMenu()
{
	var mX = window.event.clientX + document.body.scrollLeft;
	var mY = window.event.clientY + document.body.scrollTop;
	var h = 20;

	var aryNode;
	if (oCurNode) {
		aryNode = menu_mkNodePath(oCurNode.id);

		var e = document.all.tags('DIV');
		for (var i = 0; i < e.length; i++) {
			var d = e.item(i);
			if (menu_isMenuNode(d)) {
				if (menu_inCurrentPath(d, aryNode)) {
					var bOutside = true;
					for (var j = 0; j < aryNode.length; j++) {
						var oNode = eval(aryNode[j]);
						if (! menu_isOutofBoundingbox(mX, mY, oNode)) {
							bOutside = false;
							break;
						}
					}
					if (bOutside) {
						d.style.display = 'none';
						menu_clearShadow(d);
					}
				}
				else {
					if (menu_isOutofBoundingbox(mX, mY, d)) {
						d.style.display = 'none';
						menu_clearShadow(d);
					}
				}
			}
		}
	}

}

function menu_isOutofBoundingbox(mx, my, oNode)
{
	var bYes = false;
	var h = 20;

	if ((mx < parseInt(oNode.style.left)) || (mx > parseInt(oNode.style.left) + oNode.offsetWidth)) {
		bYes = true;
	}
	if ((my < parseInt(oNode.style.top) - h) || (my > parseInt(oNode.style.top) + oNode.offsetHeight)) {
		bYes = true;
	}

	if (my < parseInt(oNode.style.top) && (my > parseInt(oNode.style.top) - h)) {
		var tNode = window.event.srcElement;
		if (tNode.tagName == 'SPAN') {
			if (! menu_isSubmenu(tNode, oNode)) {
				bYes = true;
			}
		}
	}
	
	return bYes;
}

//////////////////////////////////////////////
// check to see if oMenu is submenu of oParent!
function menu_isSubmenu(oParent, oMenu)
{
	 return(oParent.getAttribute('SUBNODE') == oMenu.id);
}

function menu_setCurrentNode(oElement)
{
	var aryNode = new Array();

	aryNode[0] = document.all.tags('TR');
	aryNode[1] = document.all.tags('SPAN');
	for (var k = 0; k < aryNode.length; k++) {
		for (var i = 0; i < aryNode[k].length; i++) {
			var d = aryNode[k].item(i);
			if (d.getAttribute('CURMNODE') == '1') {
				d.setAttribute('CURMNODE', '0');
				d.style.backgroundColor = d.getAttribute('LCOLOR');
			}
		}
	}

	oElement.style.backgroundColor = oElement.getAttribute('HCOLOR');
	oElement.setAttribute('CURMNODE', '1');
}

function menu_makeShadow(el, color, size)
{
	for (var i = size; i > 0; i--)
	{
		var rect = document.createElement('DIV');
		var rs = rect.style;
		rs.position = 'absolute';
		rs.left = (el.style.posLeft + i) + 'px';
		rs.top = (el.style.posTop + i) + 'px';
		rs.width = el.offsetWidth + 'px';
		rs.height = el.offsetHeight + 'px';
		rs.zIndex = el.style.zIndex - i;
		rs.backgroundColor = color;
		var opacity = 1 - i / (i + 1);
		rs.filter = 'alpha(opacity = ' + (100 * opacity) + ')';
		el.insertAdjacentElement('afterEnd', rect);
	}
}

function menu_clearShadow(oNode)
{
	var tNode = oNode.firstChild;
	if (tNode) {
		oNode.innerHTML = tNode.outerHTML;
	}
}

function menu_expandTree(sNode)
{
	if (sNode == '') {
		return;
	}

	var aryNode = menu_mkNodePath(sNode);

	var e = document.all.tags('TR');
	for (var i = 0; i < e.length; i++) {
		var d = e.item(i);
		if (! menu_inCurrentPath(d, aryNode)) {
			menu_mkNodeCollapse(d);
		}
		if (menu_isMenuNode(d) && ! menu_isElementOfArray(d.id, aryNode)) {
			if (d.style.display == '') {
				d.style.display = 'none';
			}
		}
	}
	for (var i = 0; i < e.length; i++) {
		var d = e.item(i);
		if (menu_isMenuNode(d) && menu_isElementOfArray(d.id, aryNode)) {
			if (d.style.display == 'none') {
				d.style.display = '';
			}
		}
	}
}

function menu_mkNodePath(sNode)
{
	var aryNode = new Array();

	if (!(sNode == null || sNode == '')) {
		var aryPath = sNode.split('_');

		for (var i = 1; i < aryPath.length; i++) {
			aryNode[i-1] = '';
			for (var j = 0; j < i; j++) {
				aryNode[i-1] += aryPath[j] + '_';
			}
			aryNode[i-1] += aryPath[i];
		}
	}

	return aryNode;
}

function menu_collapseTree(sNode)
{
	if (sNode == '') {
		return;
	}

	var aryPath = sNode.split('_');
	var aryNode = new Array();
	for (var i = 1; i < aryPath.length; i++) {
		aryNode[i-1] = '';
		for (var j = 0; j < i; j++) {
			aryNode[i-1] += aryPath[j] + '_';
		}
		aryNode[i-1] += aryPath[i];
	}

	var e = document.all.tags('TR');
	for (var i = 0; i < e.length; i++) {
		var d = e.item(i);
		if (! menu_inCurrentPath(d, aryNode) || menu_isCurrentNode(d, sNode, aryNode)) {
			menu_mkNodeCollapse(d);
		}
		if (d.id && d.id == sNode) {
			d.style.display = 'none';
		}
	}
}

function menu_isMenuNode(oNode)
{
	var sNodePrefix = 'MNODE_';
	var bYes = false;

	if (oNode != null) {
		if (oNode.id && oNode.id.indexOf(sNodePrefix) >= 0) {
			bYes = true;
		}
	}

	return bYes;
}

function menu_isCurrentNode(oNode, sNode, aryNode)
{
	var idx = -1;
	var bYes = false;

	for (var i = 0; i < aryNode.length; i++) {
		if (sNode == aryNode[i]) {
			idx = i;
			break;
		}
	}

	if (menu_isMenuNode(oNode) && idx > 0 && oNode.id == aryNode[idx-1]) {
		bYes = true;
	}
	else {
		if (oNode.nextSibling != null) {
			oNode = oNode.nextSibling;
			if (oNode.nextSibling != null) {
				oNode = oNode.nextSibling;
				if (oNode.tagName == 'TR' && menu_isMenuNode(oNode) && oNode.id == sNode) {
					bYes = true;
				}
			}
		}
	}

	return bYes;
}

function menu_inCurrentPath(oNode, aryNode)
{
	var bYes = false;

	if (menu_isMenuNode(oNode) && menu_isElementOfArray(oNode.id, aryNode)) {
		bYes = true;
	}
	else {
		if (oNode.nextSibling != null) {
			oNode = oNode.nextSibling;
			if (oNode.nextSibling != null) {
				oNode = oNode.nextSibling;
				if (oNode.tagName == 'TR' && menu_isMenuNode(oNode) && menu_isElementOfArray(oNode.id, aryNode)) {
					bYes = true;
				}
			}
		}
	}

	return bYes;
}

function menu_mkNodeCollapse(oNode)
{
	var fChild = oNode.firstChild;
	if (fChild.tagName == 'TD' && fChild.getAttribute('MALTPIC') != null) {
		var sImgElement = fChild.innerHTML;
		var oImg = fChild.firstChild;
		if (oImg.getAttribute('NODETYPE') == 'EXPAND') {
			fChild.innerHTML = fChild.getAttribute('MALTPIC');
			fChild.setAttribute('MALTPIC', sImgElement);
		}
	}

}

function menu_isElementOfArray(oElem, oArray)
{
	var bYes = false;

	for (var i = 0; i < oArray.length; i++) {
		if (oElem == oArray[i]) {
			bYes = true;
			break;
		}
	}

	return bYes;
}
