var menuClasses = new Array("menu", "", "", "");
var indexedMenuData = new Array();
var timeouts = new Array();

var mString = "";
var level = 0;
var mDivs = new Array();
var vDivs = new Array();

var displayTimeout = 500;
var lOffset = 5;

var readyMenu = new Array();
readyMenu["visible"] = "";
readyMenu["invisible"] = "";

var maxLevel = 0;
var mLevel = 0;

var maxLengthStr = "";

function indexMenu(arr) {
	for (var i=0; i<arr.length; i++) {
		arr[i].level = mLevel;
		indexedMenuData[arr[i].id] = arr[i];
		if (arr[i].subparts) {
			mLevel ++;
			indexMenu(arr[i].subparts);
			mLevel --;
		}
	}
}

function defineVisible() {
	var _id = _selected_menu_id_;
	if (_id &&  indexedMenuData[_id]) {
	indexedMenuData[_id].visible = 1;
		while (indexedMenuData[_id].parent_id != -1) {
			_id = indexedMenuData[_id].parent_id;
			indexedMenuData[_id].visible = 1;
		}
	}
}

function generateMenu(mData) {
	var mStr = "";
	for (var i=0; i<mData.length; i++) {
		if ( (mData[i].visible || (mData[i].parent_id != -1 && indexedMenuData[mData[i].parent_id].visible)) && mData[i].name.length > maxLengthStr.length) {
			maxLengthStr = mData[i].name;
		}
		mStr += menuItem(mData[i], level);
		if (mData[i].subparts) {
			level ++;
			var mDiv = menuDiv(mData[i]);
			if (mData[i].visible) {
				if (maxLevel < level) {
					maxLevel = level
				}
				vDivs[mData[i].id] = mDiv;
				mStr += mDiv;
			} else {
				mDivs[mData[i].id] = mDiv;
			}
			level --;
		}
	}
	return mStr;
}

function menuDiv(mItem) {
	var dStr = "<div id=\"m" + mItem.id + "\" class=\"" + (mItem.visible ? (mItem.parent_id == -1 ? "mBottom " : "") + "mVisibile" : "mHidden") + "\"" + (!mItem.visible ? "onmouseover=\"eraseHideTimeout('" + mItem.id + "');\" onmouseout=\"setHideTimeout('" + mItem.id + "', 1);\"" : "") + ">" +
		generateMenu(mItem.subparts) +
		"</div>";
	return dStr;
}

function menuItem(item, level) {
	var mLink = "<a class=\"" + menuClasses[level] + (item.subparts && !item.visible ? " subparts" : "") + (item.visible ? " selected" : "") + "\" href=\"" + item.href + "\" title=\""+ item.desc +"\"" +
				(item.subparts && !item.visible ? " onmouseover=\"showSubMenu('"+item.id+"')\" onmouseout=\"setHideTimeout('"+ item.id +"')\" " : "") +
				"><div id=\"a"+ item.id + "\">" + (level > 0 && indexedMenuData[item.parent_id].visible ? "<img src=\"/img/corner1.gif\" border=0 hspace=0 vspace=0 align=absmiddle>" : "") + "&nbsp;" + item.name + "</div></a>\n";
	return mLink;
}

function outputMenu() {
	readyMenu["visible"] = generateMenu(menuData);
	for (var _id in mDivs) { // store invisible content separately
		readyMenu["invisible"] += mDivs[_id];
	}
}

function getAbsPos(obj, pos) {
	var absPos = 0;
	if (!obj) {
		return null;
	}
	while (obj.tagName != "BODY") {
		absPos += (pos == "Left" ? obj.offsetLeft : obj.offsetTop);
		obj = obj.offsetParent;
	}
	return absPos;
}

function showSubMenu(_id) {
	var cTimeOut = new Array();
	var id_ = _id;
	cTimeOut[id_] = "1";
	eraseHideTimeout(_id);
	while (indexedMenuData[id_].parent_id != -1) {
		id_ = indexedMenuData[id_].parent_id;
		cTimeOut[id_] = "1";
	}
	for (id_ in timeouts) {
		var _d = document.getElementById("m" + id_);
		if (!cTimeOut[id_] && _d && _d.style.display != "none") {
			hideSubMenu(id_);
		}
	}
	var _d = document.getElementById("m" + _id);
	if (_d) {
		var _a = document.getElementById("a" + _id);
		_d.style.top = getAbsPos(_a, "Top");
		_d.style.left = getAbsPos(_a, "Left") + _a.offsetWidth + lOffset;
		_d.style.display = "block";
	}
}

function hideSubMenu(_id) {
	var _d = document.getElementById("m" + _id);
	if (_d) {
		_d.style.display = "none";
	}
}

function setHideTimeout(_id, _all) {
	timeouts[_id] = setTimeout("hideSubMenu('" + _id + "')", displayTimeout);
	if (_all) {
		while (indexedMenuData[_id].parent_id != -1 && !indexedMenuData[indexedMenuData[_id].parent_id].visible) {
			_id = indexedMenuData[_id].parent_id;
			timeouts[_id] = setTimeout("hideSubMenu('" + _id + "')", displayTimeout);
		}
	}
}

function eraseHideTimeout(_id) {
	clearTimeout(timeouts[_id]);
	while (indexedMenuData[_id].parent_id != -1) {
		_id = indexedMenuData[_id].parent_id;
		clearTimeout(timeouts[_id]);
	}
}

function getAbsPos(obj, pos) {
	var absPos = 0;
	var s = "  ";	
	if (!obj) {
		return null;
	}
	while (obj.tagName != "BODY") {
		absPos += (pos == "Left" ? obj.offsetLeft : obj.offsetTop);
		s += obj.tagName + " " + (pos == "Left" ? obj.offsetLeft : obj.offsetTop) + "\n";
		obj = obj.offsetParent;
	}
//	alert(pos + s);
	return absPos;
}
