/*
 * file: menu.js
 * -
 * What: Modulex main menu
 * When: On page load
 * Why: Initiate Modulex main menu
 */

/* Global variables */
var gMenuConfig = {
	divId: 'mainMenu',
	speed: 0.15,
	delay: 0.01
};

/* Initialization */
Event.observe(window, "load", function() {

		/* Initiate Menu */
		new Menu.load();
		
}, false);

/*
 * object: Menu
 * -
 * What: 
 * When: 
 * Why: 
 */
 
var Menu = {

	/*
	 * function: Menu.load()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	load: function() {
		
		/* Clean Main element whitespace */
		$("mainMenu").cleanWhitespace();
		
		var allMenuElementTags = $("mainMenu").getElementsByClassName("menuElement");
	
		/* element tags handler */
		for (var i = 0; i < allMenuElementTags.length; i++) {
	
			/* Clean each element whitespace */
			allMenuElementTags[i].cleanWhitespace();
		
			/* set css property "border-right: none" on last child */
			if(i == (allMenuElementTags.length - 1)) {
				allMenuElementTags[i].setStyle({backgroundImage: 'none'});
			}
			
			/* filter nodes that have more than 2 childNodes */
			if(eval(allMenuElementTags[i].childNodes[1]) != undefined) {
				
				allMenuElementTags[i].mouseIsOver = false;
				allMenuElementTags[i].submenuIsOpen = false;
				
				/* Position Submenu */
				
				var submenuElement = allMenuElementTags[i].childNodes[1];
				submenuElement.originalStyle = {
					position: submenuElement.getStyle('position'),
				    top: submenuElement.parentNode.getDimensions().height+"px",
				    left: submenuElement.getStyle('left'),
				    height: submenuElement.getDimensions().height+"px"
			    };
				submenuElement.setStyle(submenuElement.originalStyle);
				
				/* "mouseover" event on first element of the node */
				allMenuElementTags[i].observe('mouseover', function(event) {
					
					var currentElement = Event.element(event);

					if(currentElement.tagName.toLowerCase() == "a" && eval(currentElement.nextSibling) != undefined) {
					
						currentElement.parentNode.mouseIsOver = true;
					
						if(currentElement.parentNode.submenuIsOpen == false) {
							
							/* SlideDown effect on second childNode (submenu) */
							new Effect.BlindDown(currentElement.nextSibling, {
								duration: gMenuConfig.speed,
								beforeStart: function(effect) {
									currentElement.parentNode.submenuIsOpen = true;
								},
								afterFinish: function(effect) {
								
									/* Reset orginal style */
									currentElement.nextSibling.setStyle(currentElement.nextSibling.originalStyle);
								}
							});
						} else {
						
							/* If submenu not yet closed, delay opening */
							currentElement.parentNode.overDelay = setInterval( function() {
							
								/* Test if mouse is over element and submenu closed */
								if(currentElement.parentNode.mouseIsOver == true && currentElement.parentNode.submenuIsOpen == false) {
						
									/* clear overDelay intervals */
									clearInterval(currentElement.parentNode.overDelay);
									
									/* SlideDown effect on second childNode (submenu) */
									new Effect.BlindDown(currentElement.nextSibling, {
										duration: gMenuConfig.speed,
										beforeStart: function(effect) {
											currentElement.parentNode.submenuIsOpen = true;
										},
										afterFinish: function(effect) {
											/* Reset orginal style */
											currentElement.nextSibling.setStyle(currentElement.nextSibling.originalStyle);
										}
									});
								}
								
							}, (gMenuConfig.delay)*1000);
						}
						
						/* clear outDelay intervals */
						clearInterval(currentElement.parentNode.outDelay);
						
						/* Set mouse-over property on mouse-over and mouse-out the second childNode (submenu) */
						if(eval(currentElement.nextSibling) != undefined) {
							currentElement.nextSibling.onmouseover = function() {
								currentElement.parentNode.mouseIsOver = true;
							}
							currentElement.nextSibling.onmouseout = function() {
								currentElement.parentNode.mouseIsOver = false;
							}
						}
					}
				}, false);
				
				/* "mouseout" event on first element of the node */
				allMenuElementTags[i].observe('mouseout', function(event) {
					
					/* Test if parent is <li> element because of Safari bug */
					if(Event.element(event).parentNode.tagName.toLowerCase() == "li") {
						var currentElement = Event.element(event);
					} else {
						var currentElement = Event.element(event).parentNode;
					}
					
					currentElement.parentNode.mouseIsOver = false;
					
					/* Test if element is a <a> tag */
					if(currentElement.tagName.toLowerCase() == "a" && currentElement.parentNode.submenuIsOpen == true) {
					
						currentElement.parentNode.outDelay = setInterval( function() {
							
							if(currentElement.parentNode.mouseIsOver == false && currentElement.parentNode.submenuIsOpen == true) {
								
								/* clear outDelay intervals */
								clearInterval(currentElement.parentNode.outDelay);
								
								/* Slide-down effect on second childNode (submenu) */
								new Effect.BlindUp(currentElement.nextSibling, {
									duration: gMenuConfig.speed,
									queue: 'end',
									afterFinish: function(effect) {
										currentElement.parentNode.submenuIsOpen = false;
										
									}
								});
							}
							
						}, (gMenuConfig.delay)*1000);
					}
				}, false);
			}
		}
		
		
		return true;
	}
}
