( function() {

	var $E = YAHOO.util.Event,
		$D = YAHOO.util.Dom;

	var menus = ['orgDemo', 'list', 'live', 'studio', 'tools', 'learn'];

	function initMenus() { 
			var menu, area, l;
	
		forEach( menus, function( o ) {
			area = document.getElementById( o + 'Area' );
			menu = document.getElementById( o + 'Menu' );
			if( area && menu ) {
				$E.on( area, 'mouseover', areaMouseOverHandler );
				$E.on( area, 'mouseout', areaMouseOutHandler );				
				$E.on( menu, 'mouseout', menuMouseOutHandler );
				$E.on( area, 'click', function( e ) { $E.stopEvent( e ); } );
				
				if (document.all&&document.getElementById) {
					forEach( menu.childNodes, function( node ) {
						if (node.nodeName=="LI") {
							$E.on( node, 'mouseover', function( e ) {
								$D.addClass( this, 'over' );
							} );
							$E.on( node, 'mouseout', function( e ) {
								$D.removeClass( this, 'over' );
							} );
			   			}
				  	} );
				}
			}
		} );
	}
	
	function areaMouseOverHandler( e ) {
		var a, menu, shim;
			
		a = this.nodeName == 'LI' ? this : $D.getAncestorByTagName( this, 'LI' );
		if( a ) {	
			shim = document.getElementById( a.id.replace( 'Area', 'Shim' ) );
			if( shim ) {
				$D.addClass( shim, 'active' );
			}
			menu = document.getElementById( a.id.replace( 'Area', 'Menu' ) );
			$D.addClass( menu, 'active' );	
		}
	}	

	function areaMouseOutHandler( e ) {	
		//stopEvent( e );		
		var	ul, 
			rt = $E.getRelatedTarget( e ),
			menu, a, shim, subShim;
			
		a = this.nodeName == 'LI' ? this : $D.getAncestorByTagName( this, 'LI' );
		if( a ) {	
			menu = document.getElementById( a.id.replace( 'Area', 'Menu' ) );
			shim = document.getElementById( a.id.replace( 'Area', 'Shim' ) );
			if( shim ) {
				subShim = document.getElementById( a.id.replace( 'Area', 'ShimSub' ) );
			}			
			if( rt ) {
				ul = rt.nodeName == 'UL' ? rt : $D.getAncestorByTagName( rt, 'ul' );
				if ( ! ul || ul.id != menu.id ) {
					if( shim ) {
						$D.removeClass( shim, 'active' );
						shim.className = shim.className.replace( 'active', '' );					
						if( subShim ) {
							$D.removeClass( subShim, 'active' );
						}
					}					
					menu.className = menu.className.replace( 'active', '' );
				}
			}	
		}
	}	
	
	function menuMouseOutHandler( e ) {
		var a, m, 
			rt = $E.getRelatedTarget( e ),
			menu, area, shim, subShim;
		
		if( this ) {
			menu = this.nodeName == 'UL' ? this : $D.getAncestorByTagName( this, 'ul' );
			if( menu ) {
				if( menu.id.indexOf( 'Sub' ) >= 0 ) {							
					menu = $D.getAncestorByTagName( menu, 'ul' );
				} 
				area = document.getElementById( menu.id.replace( 'Menu', 'Area' ) );
				shim = document.getElementById( menu.id.replace( 'Menu', 'Shim' ) );
				if( shim ) {
					subShim = document.getElementById( menu.id.replace( 'Menu', 'ShimSub' ) );
				}			
				if( rt && rt.tagName != 'IFRAME' ) {
					m = rt.nodeName == 'UL' ? rt : $D.getAncestorByTagName( rt, 'ul' );
					if( m && m.id.indexOf( 'Sub' ) >= 0 ) {
						m = $D.getAncestorByTagName( m, 'ul' );	
					}
					if( ! m || m.id != menu.id ) {
						a = rt.nodeName == 'LI' ? rt : $D.getAncestorByTagName( rt, 'li' );
						if ( ! a || a.id != area.id ) {
							if( shim ) {
								$D.removeClass( shim, 'active' );
								if( subShim ) {
									$D.removeClass( subShim, 'active' );
								}
							}					
							$D.removeClass( menu, 'active' );		
						}
					}
				}	
			}	
		}				
	}	
	
	function forEach( list, func, scope ) {
        var i,
            l = list.length;
        if( list.forEach ) {
            list.forEach( func, scope );
        } else {
            for( i = 0; i < l; ++i ) {
                func.call( scope, list[i], i, list );
            }
        }
	}
	
	init.push( initMenus );

} )();