if (jQuery) (function($) {
	var animators = [
		{
			name:	'DropDownMenu',
			hide:	function($pane, callback) {
				$pane.slideUp(callback);
			},
			show:	function($pane, callback) {
				$pane.slideDown(callback);
			}
		},
		{
			name:	'StaticMenu',
			hide:	function($pane, callback) {
				$pane.hide(0, callback);
			},
			show:	function($pane, callback) {
				$pane.show(0, callback);
			}
		}
	];
	var heightReset = function($child) {
		$child.css({height: $child.data('height')});
	};
	function installMenu($ul, animator) {
		function stopOne($child) {
			if ($child.data('showing')) {
				$child.data('showing', false);
				$child.data('animating', true);
				animator.hide($child, function() {
					$child.data('animating', false);
					heightReset($child);
				});
			} else if ($child.data('animating')) {
				$child.data('animating', false);
				$child.stop();
				$child.hide();
				heightReset($child);
			} else {
				heightReset($child);
			}
		}
		function cancel() {
			$ul.children('li').children('ul').each(function() {
				stopOne(jQuery(this));
			});
		}
		$ul.children('li').hover(function() {
			cancel();
			jQuery(this).children('ul').each(function() {
				var $child = jQuery(this);
				$child.data('animating', true);
				animator.show($child, function() {
					$child.data('animating', false);
					$child.data('showing', true);
				});
			});
		}, function() {
			cancel();
		}).children('ul').each(function() {
			var $child = jQuery(this);
			$child.data('height', $child.height());
			animator.hide($child);
		});
	}
	jQuery.addMutator(function(ctx) {
		var $ctx = jQuery(ctx);
		for (var i = 0; i < animators.length; i++) {
			var animator = animators[i];
			var name = animator.name;
			$ctx.find('ul.' + name).each(function() {
				installMenu(jQuery(this), animator);
			});
			$ctx.find('.Contained' + name).find('ul:first').each(function() {
				installMenu(jQuery(this), animator);
			});
			if ($ctx.is('.Contained' + name)) {
				$ctx.find('ul:first').each(function() {
					installMenu(jQuery(this), animator);
				});
			}
			var $contained = $ctx.closest('.Contained' + name);
			if ($contained.length) {
				var $ulFirst = $ctx.find('ul:first');
				if ($contained.find('ul:first')[0] == $ulFirst[0]) {
					installMenu($ulFirst, animator);
				}
			}
		}
	});
})(jQuery);

