function Schuppenmenu (menuRootBox) {                
    var thisObj      = this;
    var menuBox      = menuRootBox;
    var curElement   = null;
    var menuElements = new Array();
                                                
    function getMenuElements () { 
        var indexNumber = menuBox.childNodes.length;
        var biggestElement = null;
                    
        curElement = menuBox.childNodes[0];
                    
        for(var i = 0 ; i < menuBox.childNodes.length;i++) {                    
            if(!biggestElement) {
                biggestElement = menuBox.childNodes[i];
            } else {
                if (biggestElement.offsetHeight < menuBox.childNodes[i].offsetHeight) {
                    biggestElement = menuBox.childNodes[i];
                }
            }
                            
            menuBox.childNodes[i].style.zIndex = indexNumber--; 
                            
            mElement = {
                element:menuBox.childNodes[i],
                minYPos:null,
                maxYPos:null,
                moveDirection:null,
                open:true
            }
                                  
            menuElements.push(mElement);
	    }
                    
        return biggestElement;
    }
                        
    function placeMenuElements (bE) {
                     
                    /*
                                                       * prozentuale höhe des overflows ermitteln der sich ergibt 
                                                       *wenn man den Content betrachtet und die gesammte höhe aller Submenu Elemente
                                                       */                                                                  
        var elementTopStep = (menuBox.offsetHeight-bE.offsetHeight)/(menuElements.length-1);
        var elementTopPos  = elementTopStep;
                        
        for(var i = 0 ; i < menuElements.length;i++) {
            menuElements[i].element.style.position = 'absolute';
            menuElements[i].element.style.top      = '0px';
                            
            if(menuElements[i].element != bE) {                                                       
                menuElements[i].element.style.height = bE.offsetHeight;                                                        
                menuElements[i].element.style.top    = elementTopPos+"px";
                            
                menuElements[i].minYPos = -(menuElements[i].element.offsetHeight-elementTopStep)+elementTopPos;
                menuElements[i].maxYPos = elementTopPos;
                            
                elementTopPos           += elementTopStep; 
            } else {
                menuElements[i].minYPos = -(menuElements[i].element.offsetHeight-elementTopStep);
                menuElements[i].maxYPos = 0;
            }
                            
            Element.bindEvent(menuElements[i].element,
                         'mouseover',
                          pullOutMenuElement,
                          {
                            menuObj:menuElements[i],
                            menuElement:menuElements[i].element
                          }
                         );
        }                                               
    }                    

    function pullOutMenuElement (evt,target,rp) {
        if(curElement == target) return;
                       
        if(rp.menuObj.open) {
        /*
                       * alle Elemente des menus durchlaufen
                      */
            for(var i = 0 ; i < menuElements.length;i++) {
                if(menuElements[i].element == rp.menuElement) {
                    menuElements[i].open = true;
                    break;
                } else {
                    moveElementsIn(menuElements[i],rp.step);
                }
            }
        } else {
            for(var i = 0 ; i < menuElements.length;i++) {
                if(menuElements[i].element == rp.menuElement) {
                    for(var j = menuElements.length-1 ; j >= i ;j--)
                        moveElementsOut(menuElements[j]);
                                    
                    break;
                }
            }
        }                    
        curElement = target;                    
    }
                
    function moveElementsIn (menuObj) {                                
        function moveIn () {
			if(menuObj.moveDirection != 'top') return;
						
            if(menuObj.minYPos > parseInt(menuObj.element.style.top)-10) {
                menuObj.element.style.top = menuObj.minYPos+"px";
                return;
            }
                        
            menuObj.element.style.top = parseInt(menuObj.element.style.top)-10+"px";                      
            window.setTimeout(moveIn,10);
        }         
                    
		menuObj.moveDirection = 'top';
        menuObj.open = false;
        moveIn();
    }
                
    function moveElementsOut (menuObj) {
        function moveOut () {
			if(menuObj.moveDirection != 'down') return;
			
            if(menuObj.maxYPos < parseInt(menuObj.element.style.top)+10) {
                menuObj.element.style.top = menuObj.maxYPos+"px";
                return;
            }
                            
            menuObj.element.style.top = parseInt(menuObj.element.style.top)+10+"px";
            window.setTimeout(moveOut,10);
        }
					
        menuObj.moveDirection = 'down';
        menuObj.open = true;
        moveOut();
    }
                        
    this.initMenu = function () {
        Element.stripBreaks(menuBox);
        menuBox.style.overflow = 'hidden';
        placeMenuElements(getMenuElements());
    }
}