/**
 * @author haw5855
 */

var mouseoverManager = new function () {
	var me = this;
	
	me.linkNodes = null;
	me.contentNodes = new Array();
	
	var activeContentNode = null;
	
	me.init = function () {
		if (EventHelpers.hasPageLoadHappened(arguments)) {
			return;
		}
		
		me.linkNodes = CSSHelpers.getElementsByClassName(document, 'mouseoverLink');
		
		for (var i=0; i<me.linkNodes.length; i++) {
			var linkNode = me.linkNodes[i]
			EventHelpers.addEvent(linkNode, 'mouseover', show);
			EventHelpers.addEvent(linkNode, 'click', disableClick);
			var contentNode = getContentNode(linkNode);
			if (contentNode) {
				me.contentNodes.push(contentNode);
			}
			//EventHelpers.addEvent(me.linkNodes[i], 'mouseout', hide);
		}
		
		EventHelpers.addEvent(document, 'mousemove', hideIfNeeded);
		EventHelpers.addEvent(document, 'keyup', keyEvent)
	} 
	
	function getContentNode(linkNode) {
		
		var linkId = linkNode.id;
		var contentId = linkNode.id.replace('Link', '');
		var contentNode = document.getElementById(contentId);
		return contentNode;
	}
	
	function disableClick(e) {
		EventHelpers.preventDefault(e);
	}
	
	function show (e) {
		var linkNode = EventHelpers.getEventTarget(e);
		hideActiveContentNode();
		var contentNode = getContentNode(linkNode);
		CSSHelpers.addClass(contentNode, 'shown');
		activeContentNode = contentNode;
	}
	
	function hide (e) {
		var linkNode = EventHelpers.getEventTarget(e);
		var contentNode = getContentNode(linkNode);
		CSSHelpers.removeClass(contentNode, 'shown');
	}
	
	function keyEvent(e) {
		var key = EventHelpers.getKey(e);
		
		if (key == CharCode.ESCAPE) {
			hideActiveContentNode();
		}
	}
	
	function hideActiveContentNode() {
		if (activeContentNode) {
			CSSHelpers.removeClass(activeContentNode, 'shown');
		}
	}
	
	function isInNodes (nodes, x, y) {
		for (var i=0; i<nodes.length; i++) {
			var node = nodes[i];
			if (CSSHelpers.isInObject(node, x, y)) {
				return true;
			}
		}
		
		return false;
	}
	
	function hideIfNeeded(e) {
		var shouldHide = true;
		var x = EventHelpers.getMouseX(e);
		var y = EventHelpers.getMouseY(e);
		
		if (!(isInNodes(me.contentNodes, x, y) || isInNodes(me.linkNodes, x, y))) {
			hideActiveContentNode();
		}
	}
}




EventHelpers.addPageLoadEvent('mouseoverManager.init')
