var cm_timeout = null;var cm_actiontimeout = null;
var cm_hidetimeout = null;
var cm_onclick = null;
var cm_openmenus = new Array();
var cm_selected = new Array();
var cm_contextmenu = "id_contextmenu";
var cm_active = false;
var cm_over = false;
var cm_shadows = true;

function cm_split(text) {
	if (text.indexOf("-") >= 0) return text.split("-");
	return new Array(text, "");
}

function cm_getAbsX(el) { return (el.x) ? el.x : cm_getAbsPos(el,"Left"); }
function cm_getAbsY(el) { return (el.y) ? el.y : cm_getAbsPos(el,"Top"); }
function cm_getAbsPos(el, which) {
	iPos = 0;
	while (el != null && el != undefined) {
		iPos += el["offset" + which];
		el = el.offsetParent;
	}
	return iPos;
}

function cm_setOpacity(el, al) {
	if (el) {
		el.style.opacity = al;
		el.style.MozOpacity = al;
		el.style.KhtmlOpacity = al;
		el.style.filter = "alpha(opacity=" + al*100 + ")";
	}
}

function cm_hideMenu(id) {
	var el = document.getElementById(id);
	if (el == null || el == undefined) return;
	el.style.left = "-" + (20 + el.clientWidth) + "px";
	el.style.display = "none";
	if (cm_shadows) cm_updateShadow(el);
	var tmp;
	var div = el.getElementsByTagName("TR");
	for (var i=0; i<div.length; i++) {
		tmp = cm_split(div[i].className);
		if (tmp[1] == "item") div[i].className = tmp[0]+"-item";
	}

	if (el.menuId > 0) {
		if (el.menuId < cm_openmenus.length-1) {
			var tmp = cm_openmenus.slice(el.menuId+1, cm_openmenus.length);
			cm_openmenus = cm_openmenus.slice(0, el.menuId);
			cm_openmenus = cm_openmenus.concat(tmp);
			tmp = cm_selected.slice(el.menuId+1, cm_selected.length);
			cm_selected = cm_selected.slice(0, el.menuId);
			cm_selected = cm_selected.concat(tmp);
		} else {
			cm_openmenus.pop();
			cm_selected.pop();
		}
	} else {
		cm_openmenus.shift();
		cm_selected.shift();
	}

	if (el.menuId-1 >= 0 && el.menuId-1 < cm_openmenus.length) {
		div = document.getElementById(cm_openmenus[el.menuId-1]).getElementsByTagName("TR");
		var tmp;
		for (var i=0; i<div.length; i++)
			if (div[i].getAttribute("action") == "submenu")
				if (div[i].getAttribute("uri") == id) { tmp = cm_split(div[i].className); div[i].className = tmp[0]+"-item"; }
	}
}

function cm_disableSelect() { return false; }
function cm_enableSelect() { return false; }

function cm_showMenu(id, bx, by) {
	var el = document.getElementById(id);
	if (el == null || el == undefined) return;	
	var uri = el.getAttribute("uri");
	var obj = (uri)?document.getElementById(uri):document.getElementById(id);
	if (obj == null || obj == undefined) return;

	for (var i=0; i<cm_openmenus.length; i++) if (cm_openmenus[i] == obj.id) return;
	if (el) {
		if (el.menuId < cm_openmenus.length-1) {
			cm_setTopmostMenu(cm_openmenus[el.menuId]);
		}
	}
	if (el != obj) obj.openerItemId = el.itemId;
	else obj.openerItemId = -1;

	obj.menuId = cm_openmenus.length;
	obj.parentMenuId = obj.menuId-1;
	cm_openmenus.push(obj.id);
	cm_selected.push(-1);

	if (obj.initialized == undefined || obj.initialized == null) {
		obj.style.zIndex = 3000 + 10*obj.menuId;
		var col = obj.getElementsByTagName("TR");
		for (var i=0; i<col.length; i++) {
			col[i].id = obj.id + "_" + i;
			col[i].itemId = i;
			col[i].menuId = obj.menuId;
			col[i].onmouseover = function () { cm_mouseover(this); };
			col[i].onmouseout = function () { cm_mouseout(this); };
		}
		obj.initialized = true;
	} else {
		obj.style.zIndex = 3000 + 10*obj.menuId;
		var col = obj.getElementsByTagName("TR");
		for (var i=0; i<col.length; i++) col[i].menuId = obj.menuId;
	}

	if (typeof obj.onselectstart!="undefined") obj.onselectstart = cm_disableSelect;
	else {
		obj.onmousedown = cm_disableSelect;
		obj.onmouseup = cm_enableSelect;
	}

	obj.style.display = "block";

	var windowWidth = document.body.clientWidth;
	var windowHeight = document.body.clientHeight;
	var scrollLeft = document.body.scrollLeft;
	var scrollTop = document.body.scrollTop;

	var baseX = (bx)?bx:cm_getAbsX(el);
	var baseY = (by)?by:cm_getAbsY(el);
	var menuWidth = obj.offsetWidth;
	var menuHeight = obj.offsetHeight;

	var parentWidth = (el == obj)?0:el.offsetWidth;
	var parentHeight = (el == obj)?0:el.offsetHeight;
	
	var x = scrollLeft + baseX + ((baseX+menuWidth+parentWidth > windowWidth)?-menuWidth:parentWidth);
	x = (x<0)?0:x;
	var y = scrollTop + baseY + ((baseY+menuHeight+parentHeight > windowHeight)?-menuHeight+parentHeight:0);
	y = (y<0)?0:y;

	obj.style.left = x;
	obj.style.top = y;
	if (cm_shadows) cm_updateShadow(obj);
}

function cm_executeAction(id) {
	var result = false;
	if (id == undefined || id == null || id == "") return false;
	el = document.getElementById(id);
	var tmp = cm_split(el.className);
	if (tmp[1] != "item") return result;

	var action = el.getAttribute("action");
	switch (action.toLowerCase()) {
		case "submenu":
			cm_clearHideTimeout();
			cm_showMenu(id);
			result = true;
			break;
		case "link":
			var uri = el.getAttribute("uri");
			if (uri) ; else break;
			var target = el.getAttribute("target");
			target = (target)?target:"_self";
			window.open(el.getAttribute("uri"), target);
			break;
		case "javascript":
			var uri = el.getAttribute("uri");
			if (uri) ; else break;
			eval(uri);
			break;
		default: result = false; break;
	}
	return result;
}

function cm_setTopmostMenu(id) {
	if (cm_openmenus.length == 0) return;
	for (var i=0; i<cm_openmenus.length-1; i++)
		if (cm_openmenus[i] == id) break;
	for (var j=cm_openmenus.length-1; j>i; j--) {
		cm_hideMenu(cm_openmenus[j]);
	}
}

function cm_setHideTimeout(id) {
	if (cm_hidetimeout != null) cm_clearHideTimeout();
	var el = document.getElementById(id);
	if (el == null || el == undefined) return;
	eval("cm_hidetimeout = setTimeout(function () { cm_setTopmostMenu('"+id+"'); if (!cm_over) { var obj = document.getElementById('"+id+"_'+cm_selected[cm_selected.length-1]); if (obj) { var tmp = cm_split(obj.className); obj.className=tmp[0]+'-item'; cm_selected[cm_selected.length-1]=-1;} } }, 500);");
}

function cm_clearHideTimeout() {
	clearTimeout(cm_hidetimeout);
	cm_hidetimeout = null;
}

function cm_setActionTimeout(el) {
	if (cm_actiontimeout != null) cm_clearActionTimeout();
	cm_setHideTimeout(cm_openmenus[el.menuId]);
	var action = el.getAttribute("action");
	if (action == "submenu") eval("cm_actiontimeout = setTimeout(function () { cm_executeAction('"+el.id+"'); }, 500);");
}

function cm_clearActionTimeout() {
	clearTimeout(cm_actiontimeout);
	cm_actiontimeout = null;
}

function cm_closeMenu(event) {
	document.onclick = cm_onclick;
	if (cm_onclick != null && cm_onclick != undefined && event != null && event != undefined) cm_onclick(event);
	cm_onclick = null;
	cm_clearHideTimeout();
	cm_clearActionTimeout();
	cm_clearCMTimeout();
	cm_active = false;
	while (cm_openmenus.length > 0) cm_hideMenu(cm_openmenus[cm_openmenus.length-1]);
	while (cm_selected.length > 0) cm_selected.pop();
	var obj = document.getElementById("cm_id_menuopener");
	if (obj) {
		cm_removeShadow(obj);
		obj.parentNode.removeChild(obj);
		try {ch_toggle_dropdown_hack(false);} catch (e) {}
	}
}

function cm_menuClick(event) {
	if (event == null || event == undefined) event = window.event;
	var action = null;
	if (event) if (event.clientX) {
		var t = (event.target)?event.target:event.srcElement;
		while (t.parentNode != undefined && t.parentNode != null) {
			if (cm_split(t.className)[1] == "item") break;
			t = t.parentNode;
		}
	}
	if (cm_executeAction(t.id)) return; // Menu click

	cm_closeMenu(event);
}

function cm_removeShadow(el) {
	var shadow = document.getElementById(el.id+"_shadow");
	if (shadow) shadow.parentNode.removeChild(shadow);
}

function cm_updateShadow(el) {
	var x = el.style.left;
	var y = el.style.top;
	var width = el.offsetWidth;
	var height = el.offsetHeight;
	var shadow = document.getElementById(el.id+"_shadow");
	if (shadow) {
		shadow.style.left = x;
		shadow.style.top = y;
		shadow.style.zIndex = el.style.zIndex -1;
		shadow.style.display = el.style.display;
	} else {
		var newdiv, newdiv2;
		newdiv2 = document.createElement("DIV")
		newdiv2.style.position = "absolute";
		newdiv2.id = el.id+"_shadow";
		for (var i=1; i<3; i++) {
			newdiv = document.createElement("DIV");
			newdiv.className = "cm-shadow";
			newdiv.style.width = width-3;
			newdiv.style.height = height-3;
			newdiv.style.left = 3+i;
			newdiv.style.top = 3+i;
			newdiv.style.zIndex = 10 -i;
			cm_setOpacity(newdiv, .5/i);
			newdiv2.appendChild(newdiv);
		}
		newdiv2.style.left = x;
		newdiv2.style.top = y;
		newdiv2.style.zIndex = el.style.zIndex -1;
		document.body.appendChild(newdiv2);
	}
}

function cm_openContextMenu(event) {
	if (event == null || event == undefined) event = window.event;
	var div = document.getElementById(cm_contextmenu);

	if (cm_active) cm_closeMenu();
	cm_onclick = document.onclick;
	document.onclick = cm_menuClick;

	cm_clearHideTimeout();
	cm_clearActionTimeout();
	cm_clearCMTimeout();
	while (cm_selected.length > 0) cm_selected.pop();

	cm_showMenu(cm_contextmenu, event.clientX, event.clientY);
	cm_active = true;

	return false;
}
if (document.getElementById) if (document.getElementById(cm_contextmenu)) document.oncontextmenu = cm_openContextMenu;

function cm_mouseover(el) {
	var tmp = cm_split(el.className);
	switch (tmp[1]) {
		case "menu":
			cm_over = true;
			var pid = el.parentMenuId;
			cm_clearCMTimeout();
			if (pid < 0) break;
			if (el.menuId == cm_openmenus.length-1) cm_clearHideTimeout();

			if (cm_selected[pid] != el.openerItemId && cm_selected[pid] >= 0) {
				tmp = cm_split(document.getElementById(cm_openmenus[pid]).className);
				document.getElementById(cm_openmenus[pid] + "_" + cm_selected[pid]).className = tmp[0]+'-item';
				var obj = document.getElementById(cm_openmenus[pid] + "_" + el.openerItemId);
				if (obj) {
					tmp = cm_split(obj.className);
					obj.className = tmp[0]+'-item-over';
					cm_selected[obj.menuId] = obj.itemId;
				}
			}
			break;
		case "item":
			if (!cm_active) break;
			var old = cm_selected[el.menuId];
			if (old == el.itemId) break;
			if (old >= 0) document.getElementById(cm_openmenus[el.menuId] + "_" + old).className = tmp[0]+'-item';
			cm_selected[el.menuId] = el.itemId;
			el.className=tmp[0]+'-item-over';
			cm_setActionTimeout(el);
			break;
		case "menuopener":
			el.className = tmp[0]+"-menuopener-over";
			if (document.getElementById("cm_id_menuopener")) ; else break;
			var uri = el.getAttribute("uri");
			if (cm_active && uri != cm_openmenus[0]) openMenu(uri, el);
			break;
		default: break;
	}
}

function cm_mouseout(el) {
	var tmp = cm_split(el.className);
	switch (tmp[1]) {
		case "menu":
			cm_over = false;
			break;
		case "item":
			if (el.getAttribute("action") == "submenu") cm_clearActionTimeout();
			if (el.menuId == cm_openmenus.length-1 || cm_actiontimeout != null) {
				el.className = tmp[0]+'-item';
				cm_selected[el.menuId] = -1;
			}
			break;
		case "menuopener":
			el.className = tmp[0]+"-menuopener";
			break;
		default: break;
	}
}

function cm_click(el) {
	var tmp = cm_split(el.className);
	switch (tmp[1]) {
		case "menuopener":
			openMenu(el.getAttribute("uri"), el, true);
			break;
		default: break;
	}
}

function cm_clearCMTimeout() {
	clearTimeout(cm_timeout);
	cm_timeout = null;
}

function openMenu(id, el, clicked) {
	if (document.getElementById == undefined) return;
	var div = document.getElementById(id);
	if (div == undefined) return;

	if (cm_active) {
		if (cm_openmenus[0] == id) { cm_closeMenu(); return; }
		cm_closeMenu();
	}
	cm_onclick = document.onclick;
	if (clicked) document.onclick = function () { document.onclick = cm_menuClick; };
	else document.onclick = cm_menuClick;
    try {ch_toggle_dropdown_hack(true);} catch (e) {};

	cm_clearHideTimeout();
	cm_clearActionTimeout();
	cm_clearCMTimeout();
	while (cm_selected.length > 0) cm_selected.pop();

	if (div.offsetWidth > 0 && div.offsetWidth < el.offsetWidth) div.style.width = el.offsetWidth;
	var x = cm_getAbsX(el);
	var y = cm_getAbsY(el);

	var dupe = el.cloneNode(true);
	dupe.className = "cm-menuopener-down";
	dupe.style.position = "absolute";
	dupe.id = "cm_id_menuopener";
	dupe.onmouseover = function () {};
	dupe.onmouseout = function () {};
	dupe.onmousedown = function () {};
	dupe.onmouseup = function () {};
	dupe.style.left = x;
	dupe.style.top = y;
	dupe.style.zIndex = 3000-10;
	document.body.appendChild(dupe);
	cm_updateShadow(dupe);
	dupe.style.zIndex = 3000*2;

	cm_showMenu(id, x, y+el.offsetHeight-1);
	cm_active = true;
}

// FOR DEBUGGING
function dump(text) {
	document.body.appendChild(document.createTextNode(text+""));
	document.body.appendChild(document.createElement("BR"));
}
/*
*/

