(function(){
	function firstCommonAncestor(elm1, elm2){
		var p = elm1.up();
		while( !elm2.descendantOf(p) ){
			p = p.up();
		}
		return p;
	}
	function stopEvent(e){
		try{
			e.stop();
		}catch(ex){}
	}
	Event.observe(document, 'mouseout', function(e){
		var from = e.element();
		var to = e.relatedTarget;
		p = null;
		if ( !to || (from !== to && !to.descendantOf(from))) {
			/* mouseleave should bubble up until the to element because we have left all elements up to that one */
			var stopOn = null;
			if( to ){
				if( from.descendantOf(to) ){
					stopOn = to.childElements();
				}else{
					p = firstCommonAncestor(from, to);
					if( p && to.descendantOf(p) ){
						stopOn = p.childElements();
					}
				}
			}
			if( stopOn ){
				stopOn.invoke('observe', 'custom:mouseleave', stopEvent);
			}
			from.fire('custom:mouseleave');
			if( stopOn ){
				stopOn.invoke('stopObserving', 'custom:mouseleave', stopEvent);
			}
		}
		var p = null;
		if( to && !from.descendantOf(to)){
			/* mouseenter can bubble, no problem! */
			var stopOn = null;
			if( to.descendantOf(from)){
				stopOn = from.childElements();
			}else{
				// do first common ancestor's children, see below.
				p = firstCommonAncestor(to, from);
				stopOn = p.childElements();
			}
			if( stopOn ){
				stopOn.invoke('observe', 'custom:mouseenter', stopEvent);
			}
			to.fire('custom:mouseenter');
			if( stopOn ){
				stopOn.invoke('stopObserving', 'custom:mouseenter', stopEvent);
			}
		}
	});
})();
/**
 * CHUNKY MOVE SUB NAVIGATION
 * A replacement for the older Chunky Move flash navigation.
 * Written for Prototype/Scriptaculous since Chunky Move currently uses those
 * @author: Rhys Burnie, Icon.inc, http://iconinc.com.au
 */
(function(){
	if(typeof(Prototype)==undefined) return;
	
	var d = .15, t = Effect.Transitions.sinoidal;
	
	document.observe("dom:loaded", function() { 
		$$('.nav-sub a').each(function(el,i){
			var parent = el.up('li').setStyle('cursor:pointer;cursor:hand');
			parent.setStyle('height:'+parent.getHeight()+'px;');
			el.addClassName('enhanced');
			parent.observe('custom:mouseenter',function(){
				var h = this.getHeight();
				el.morph('margin-top: '+(0-(h/2))+'px;opacity:0;',{
					duration: (d/2)
					, transition: t
					, afterFinish: function(m) {
						el.setStyle('margin-top:'+(h/2)+'px;').addClassName('over').morph('margin-top: 0px;opacity:1;',{
							duration:(d/2),transition:t
						});
					}
				});
			}).observe('custom:mouseleave',function(){
				var h = this.getHeight();
				el.morph('margin-top: '+(h/2)+'px;opacity:0;',{
					duration: (d/2)
					, transition: t
					, afterFinish: function(m) {
						el.setStyle('margin-top:'+(0-(h/2))+'px;').removeClassName('over').morph('margin-top: 0px;opacity:1;',{
							duration:(d/2),transition:t
						});
					}
				});
			});
		});
	});
})();
