function menuFinalize(menuItems) {

	var curItem = null;
	var pos = navGetElementPosition('menupos');
	var mPos = document.getElementById('menupos');
	var curTop = pos.top;
	var curLeft = pos.left;

	for (var i = 0; i < menuItems.length; i++ ) {
		if (menuItems[i][0] == '') {
			//separator, div
			curItem = document.getElementById('e0_' + (i+1) + 'i');
      		if (curItem) {
      		    curItem.style.top = curTop + 'px';
      		    curItem.style.left = curLeft + 'px';
      		    curItem.style.width = navMenuW + 'px';
      		    curItem.style.height = navMenuSepH + 'px';
      		    curItem.style.position = 'absolute';
      		};
      		curTop = curTop + navMenuSepH;
		} else {
			//menu, get <a>
			curItem = document.getElementById('e0_' + (i+1) + 'o');
      		if (curItem) {
      		    curItem.style.top = '0px';
      		    curItem.style.left = '0px';
      		    //TODO: get 8 from padding = 2*4
      		    curItem.style.width = (navMenuW - 8) + 'px';
      		    curItem.style.height = (navMenuH - 8) + 'px';
      		    curItem.style.position = 'absolute';
      		    curItem.onmouseover = navL0ElementMouseOver;
      		    curItem.onmouseout = navL0ElementMouseOut;
      		    curItem.navDiv = document.getElementById('e0_' + (i+1) + 'i');
      		    curItem.navLevel = 0;
      		    curItem.menupos = mPos;
      		    curItem.hasChildren = (menuItems[i].length >= 5);
      		    curItem.HTMLexpanded = (menuItems[i][3]['expanded'] == 'true');
      		    curItem.expand = function() {
               		if (this.menupos.hideTimeout) {
               			clearTimeout(this.menupos.hideTimeout);
               			this.menupos.hideTimeout = undefined;
               		};

      		    	if (!this.menupos.expanded || (this.menupos.expanded != this)) {
                  		if (this.menupos.expanded) {
                  			this.menupos.expanded.collapse();
                  			this.menupos.expanded = undefined;
                  		};

                 		toggleVisibility(this.navDivs, 'visible');
                 		toggleVisibility(this.navAs, 'visible');
                		this.menupos.expanded = this;
                	};
      		    };
      		    curItem.collapse = function() {
             		toggleVisibility(this.navDivs, 'hidden');
             		toggleVisibility(this.navAs, 'hidden');
             		if (this.menupos.expanded && (this.menupos.expanded == this)) {
             			this.menupos.expanded = undefined;
             		}
      		    };


      		    if (curItem.hasChildren) {
      		    	curItem.items = menuItems[i][4];
       		    	curItem.navDivs = [];
       		    	curItem.navAs = [];
       		    	//2nd level
       		    	var l2Top = curTop;
       		    	for (var j = 0; j < curItem.items.length; j++) {
       		    	//create div's & a's
       		    	//<div id="{concat('e0_', position(), 'i')}" style="height: 25px;" class="m0l0oout"><a style="float: left;" title="{title}" id="{concat('e0_', position(), 'o')}" class="m0l0iout" href="{url}"><xsl:value-of select="caption"/></a></div>
       		    		var cDiv = null;
       		    		if (!curItem.HTMLexpanded) {
       		    			cDiv = navCreateElement('div', mPos);
         		    		cDiv.id = 'e1_' + i + '_' + j + 'i';
       		    		} else {
       		    			cDiv = document.getElementById('e1_' + (i+1) + '_' + (j+1) + 'i');
       		    			mPos.appendChild(cDiv);
       		    		};
       		    		cDiv.className = 'm0l1oout';
      		    		cDiv.style.visibility = 'hidden';
      		    		cDiv.style.zIndex = curItem.style.zIndex + 10;
       		    		cDiv.style.position = 'absolute';
             		    cDiv.style.top = l2Top + levelVOffset + 'px';
             		    if (!curItem.HTMLexpanded) cDiv.style.left = curLeft + levelHOffset + 'px';
             		   	else cDiv.style.left = curLeft + levelHOffset - navMenuLevel2HOffset + 'px';
             		    cDiv.style.width = navMenuLevel2W + 'px';
             		    cDiv.style.height = navMenuH + 'px';
             		    curItem.navDivs[curItem.navDivs.length] = cDiv;

             		    var cA = null;
       		    		if (!curItem.HTMLexpanded) {
       		    			cA = navCreateElement('a', cDiv);
         		    		cA.id = 'e1_' + i + '_' + j + 'o';
                 		    cA.innerHTML = curItem.items[j][1];
                 		    cA.href = curItem.items[j][2];
                 		    if (curItem.items[j][3]['onclick'] != '') {
                 		    	if (cA.onclick) cA.onclick = curItem.items[j][3]['onclick'];
                 		    }
       		    		} else {
       		    			cA = document.getElementById('e1_' + (i+1) + '_' + (j+1) + 'o');
       		    			cDiv.appendChild(cA);
       		    		};
       		    		cA.className = 'm0l1iout';       		    		
      		    		cA.style.visibility = 'hidden';
      		    		cA.style.zIndex = cDiv.style.zIndex + 1;
             		    cA.style.position = 'absolute';             		    
             		    cA.style.width = navMenuLevel2W - 8 + 'px';
             		    cA.style.height = navMenuH - 8 + 'px';

             		    cA.navDiv = cDiv;
             		    cA.parentA = curItem;
             		    cA.menupos = mPos;
             		    cA.onmouseover = navL0ElementMouseOver;
             		    cA.onmouseout = navL0ElementMouseOut;
             		    cA.navLevel = 1;
             		    curItem.navAs[curItem.navAs.length] = cA;

             		    l2Top = l2Top + navMenuH;
       		    	};//for
      		    };
      		};
      		//menu, div
			curItem = document.getElementById('e0_' + (i+1) + 'i');
      		if (curItem) {
      		    curItem.style.top = curTop + 'px';
      		    curItem.style.left = curLeft + 'px';
      		    curItem.style.width = navMenuW + 'px';
      		    curItem.style.height = navMenuH + 'px';
      		    curItem.style.position = 'absolute';
      		};
      		curTop = curTop + navMenuH;
		};//if
	};//for

	//adjust menu container height
	mPos.style.height = curTop - pos.top + 'px';
}

function navCreateElement(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};


function navGetElementPosition(elemID) {
    var offsetTrail = document.getElementById(elemID);
    var offsetLeft = 0;
    var offsetTop = 0;

    while (offsetTrail) {
        offsetLeft += offsetTrail.offsetLeft;
        offsetTop += offsetTrail.offsetTop;
        offsetTrail = offsetTrail.offsetParent;
    }

    return {left:offsetLeft, top:offsetTop};
}


function getTarget(e)
{
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;

	return targ;
}

function toggleVisibility(items, aVisibility) {
	for (var i = 0; i < items.length; i++) 
		items[i].style.visibility = aVisibility;
}

function navL0ElementMouseOver(event) {
	var t = getTarget(event);
	if (t) t.className = t.className.replace('out', 'over');
	if (t.navDiv) t.navDiv.className = t.navDiv.className.replace('out', 'over');

	if ((t.navLevel == 0) && t.hasChildren) {
		//show level 1
		t.expand();
	}

	if (t.navLevel == 1) {
		//clear timeout
   		if (t.menupos.hideTimeout) {
   			clearTimeout(t.menupos.hideTimeout);
   			t.menupos.hideTimeout = undefined;
   		};
	};
};

function navL0ElementMouseOut(event) {
	var t = getTarget(event);
	if (t) t.className = t.className.replace('over', 'out');
	if (t.navDiv) t.navDiv.className = t.navDiv.className.replace('over', 'out');

	if ((t.navLevel == 0) && t.hasChildren) {
		//hide level 1
		t.menupos.hideTimeout = setTimeout('document.getElementById(\'' + t.id + '\').collapse();', menuHideTimeout);
	};

	if (t.navLevel == 1) {
		//hide level 1
		t.menupos.hideTimeout = setTimeout('document.getElementById(\'' + t.parentA.id + '\').collapse();', menuHideTimeout);
	};
};

