(function( $, window, undefined ){
	var el, a = Array.prototype, Reverse = a._reverse || a.reverse;

	function emptyfn(){
		return this;
	}

	function clearSiblings(){
		$( el = this ).children('a').removeClass( $.data( el.parentNode , 'multi-ddm-classname' ) );
	}
	function oldMenus(){
		$( el = this ).hide().siblings('a').removeClass( $.data( el.parentNode.parentNode , 'multi-ddm-classname' ) );
	}


	$.fn.dropDownMenu = function( options ) {
		return this.each(function(){
			var $main = $(this), i = 0, $menu, timeout,
				settings = $.extend({
					timer: 500,
					parentMO: undefined,
					childMO: undefined,
					bgiframe: undefined,
					levels: []
				}, options || {}, $.metadata ? $main.metadata() : {}),

				bgiframe = $.fn.bgiframe || $.fn.bgIframe || emptyfn;

			$menu = $main.data( 'multi-ddm-classname', settings.levels[ 0 ] || settings.parentMO || settings.childMO || '' );
			while ( $menu.length > 0 ) {
				$menu = bgiframe.call(
					$menu.find('> li > ul').data( 'multi-ddm-classname', settings.levels[ ++i ] || settings.childMO || '' ),
					settings.bgiframe
				);
			}

			$main.delegate( 'li', 'mouseenter.multi-ddm', function(){
				var self = $( el = this );

				if ( timeout ) {
					clearTimeout( timeout );
				}

				Reverse.call( self.siblings('li').find('ul:visible') ).each( oldMenus ).end().each( clearSiblings );

				self.children('a').addClass( $.data( el.parentNode, 'multi-ddm-classname' ) ).siblings('ul').show()
					.children('li').each( clearSiblings );
			})
			.bind( 'mouseleave.multi-ddm', function(){
				timeout = setTimeout( closemenu, settings.timer );
			});

			function closemenu(){
				$main.find('li').each( clearSiblings );

				Reverse.call( $main.find('ul:visible') ).hide();

				if ( timeout ) {
					clearTimeout( timeout );
				}
			}

			//$( window.document ).bind( 'click.multi-ddm', closemenu );
		});
	};
})( jQuery, window || this );





