function rebuildMenu( e ) {
	//alte markierungen killen
	$('.navigatorMenue li').removeClass( 'navigatorInSelection' );
	//neue markierungen aufbauen
	markSelectionPath( e );
	//eintraege updaten
	updateMenu();
	//event handler reinitialisieren
	$('.navigatorMenue').droppy( { speed: 1 } );
	$('.navigatorMenue li').unbind( 'click', 'rebuildMenu' );
	$('.navigatorMenue li').click( rebuildMenu );
	//event bubble abbrechen
	return false;
}
function markSelectionPath( e ) {
	//element welches den klick registriert hat
	var currentElement = $( e.currentTarget );
	/*
		top-down-suche um den tiefsten pfad zu finden
	*/
	while( true ) {
		var nextSub = currentElement.children( 'ul' );
		if( nextSub.size() ) {
			/*
			tieferes Submenu existiert
			defaultEintrag auswaehlen und weitersuchen
			eq(0) um definitiv nur einen zu bekommen.
			sollte nicht noetig sein ...
			*/
			currentElement = nextSub.children('.navigatorDefault').eq( 0 );
		} else {
			break;
		}
	}
	//markieren 
	currentElement.addClass( 'navigatorInSelection' );
	/*
		bottom-up-suche nach uebergeordneten menueinträgen
		ausgehend von dem jeweils tiefsten element
	*/
 	while( true ) {
		var nextParent = currentElement.parent();
		var nextParentTagname = nextParent.get( 0 ).tagName.toLowerCase();
		if( nextParentTagname == 'ul' || nextParentTagname == 'li' ) {
			//aktuelles menu hat noch parents
			currentElement = nextParent;
			if( nextParentTagname == 'li' ) {
				//uebergeordneten menueintrag markieren
				currentElement.addClass( 'navigatorInSelection');
			}
		} else {
			break;
		}		
	}
}

function updateMenu() {
	//markierte elemente selektieren 
	navigatorSelection = $( '.navigatorInSelection' );
	//durchlaufen und menu aufbauen
	menuNum = 0;
	$( navigatorSelection  ).each( updateHelper )
}

function updateHelper( index ) {
	if( index == 0 ) {
		/*
			menuNummer finden	und markierung entfernen
		*/	
		menuNum = $( '.navigatorMenue' ).children( 'li' ).index( this );
		
		$( this ).removeClass( 'navigatorInSelection' );
	} else {
		/*
			breadcrumb und dazugehoerige untermenues aufbauen
		*/
		var posibleBreadcrumbElement = $('.navigatorMenue').children( 'li:eq(' + ( menuNum + ( index - 1  ) )+ ')' );
		var subMenu = buildSubMenu( $( this ), $( navigatorSelection[ index - 1 ] ).children( 'ul' ) );
		subMenu.addClass( 'navigatorRow' + index );
		if( posibleBreadcrumbElement.size() ) {
			posibleBreadcrumbElement.replaceWith( subMenu );
		} else {
			$( '.navigatorMenue' ).append( subMenu );
		}
	} 
}

function buildSubMenu( dom, subMenu ){
	var li = $( '<li>' );
	if( subMenu.size() ) {
		subMenu.find( 'ul' ).andSelf().hide();
		li.prepend( subMenu.clone() );
	}
	return li.prepend( dom.find( ':first' ).clone() );
} 
