var dom = typeof document.getElementById != 'undefined';
var mouseX = 0, mouseY = 0;
var top = 0, left = 0, right = 0, bottom = 0;
var ua = navigator.userAgent.toLowerCase();
var activeLink = null, activeMenu = null, activeSubmenu = null;


if(document.captureEvents) {
	document.captureEvents(Event.MOUSEMOVE)
}

document.onmousemove = function(e) {
	updateMouseXY(e);
	hide();
}


function updateMouseXY(e) {
	var tempX = 0, tempY = 0;
	var IE = document.all?true:false;

	if (IE) { // grab the x-y pos.s if browser is IE
		tempX = event.clientX + document.body.scrollLeft;
		tempY = event.clientY + document.body.scrollTop;
	} else {  // grab the x-y pos.s if browser is NS
		tempX = e.pageX;
		tempY = e.pageY;
	}  
	// catch possible negative values in NS4
	if (tempX < 0){tempX = 0}
	if (tempY < 0){tempY = 0}	

	// show the position values in the form named Show
	// in the text fields named MouseX and MouseY
	mouseX = tempX;
	mouseY = tempY;

	return true;
}

function hide() {
	calcBoundries();

//document.title = mouseX + '|' + mouseY + ' :: top: ' + top + ', right: ' + right + ', bottom: ' + bottom + ', left: ' + left;

	if(activeMenu && (mouseX < left || mouseX > right || mouseY > bottom || mouseY < top)) {
		hideAll();
	}
}



function initMenus() {
	var topNav = document.getElementById('topNav');

	var navLinks = topNav.getElementsByTagName('A');

	for(var i = 0; i < navLinks.length; i++) {
		navLinks[i].ddMenu = document.getElementById('menu-' + (i+1));
		navLinks[i].onmouseover = function() {
			hideAll();

			if(!this.ddMenu) return;

			showMenu(this, this.ddMenu);
			this.ddMenu.link = this.ddMenu.getElementsByTagName('A').item(0);


			var items = this.ddMenu.getElementsByTagName('LI');
			for(var j = 0; j < items.length; j++) {
				var item = items[j];
				var itemClassName = item.className;

				item.link = item.getElementsByTagName('A').item(0);

				item.link.submenu = getObject(this.ddMenu.id + '|' + itemClassName);

				item.link.onmouseover = function() {
					hideActiveSubmenu();
					showSubMenu(this, this.submenu);
				}
			}
		}
	}
}


function showMenu(navLink, menu) {
	activeMenu = menu;
	activeLink = navLink;

	if(menu) {
		var offset = ua.indexOf('gecko') != -1 ? 15 : 24;
		var offsetY = findPosY(navLink) + offset + 'px';
		var offsetX = findPosX(navLink) + 'px';
		
		activeMenu.style.top = offsetY;
		activeMenu.style.left = offsetX;
		activeMenu.style.display = 'block';
		activeMenu.style.visibility = 'visible';
		
		calcMenuBoundries();
	}
}

function showSubMenu(subLink, sm) {
	activeSubmenu = sm;

	if(sm) {
		var parent = findParentByClassName(subLink, 'dd');
		var menuWidth = parent.offsetWidth;

		var offsetX = findPosX(parent) + menuWidth;
		var offsetY = findPosY(subLink);

		activeSubmenu.style.top = offsetY - 9 + 'px';
		activeSubmenu.style.left = offsetX + 'px';
		activeSubmenu.style.display = 'block';
		activeSubmenu.style.visibility = 'visible';

		calcSubmenuBoundries();
	}
}

function calcMenuBoundries() {
	if(activeLink && activeMenu) {
		top = findPosY(activeMenu) - 24;
		left = findPosX(activeMenu);

		right = left + activeMenu.offsetWidth;
		bottom = top + activeMenu.offsetHeight + 24;
	}
}

function calcSubmenuBoundries() {
	if(activeSubmenu) {
		var tempLeft = findPosX(activeSubmenu);
		var smTop = Number(activeSubmenu.style.top.replace('px', ''));

		if(mouseX > right) {
			top = findPosY(activeSubmenu);
			bottom = top + activeSubmenu.offsetHeight;
		}
		right = tempLeft + activeSubmenu.offsetWidth;
	}

}


function calcBoundries() {
	calcMenuBoundries();
	calcSubmenuBoundries();
}


function hideActiveMenu() {
	if(activeMenu) {
		activeMenu.style.display = 'none';
		activeMenu.style.visibility = 'hidden';
	}
	activeMenu = null;
	activeLink = null;
}

function hideActiveSubmenu() {
	if(activeSubmenu) {
		activeSubmenu.style.display = 'none';
		activeSubmenu.style.visibility = 'hidden';
	}
	activeSubmenu = null;
}

function hideAll() {
	hideActiveSubmenu();
	hideActiveMenu();
}