function iPodMenu(menu)
{
    this._animating = false;

    this._menu = menu.get_element();

    this._level = 0;
    
    this._backButton = this._menu.parentNode.getElementsByTagName('a')[0];

    var justifySubMenusWidth =
        function (root, width)
        {
            var items = root.get_items();
            
            var childList;
            
            for (var i = 0, len = items.get_count(); i < len; i++)
            {
                childList = items.getItem(i).get_childListElement();
                
                if (childList)
                {
                    childList.style.width = width + 'px';
                    
                    justifySubMenusWidth (items.getItem(i), width);
                }
            }
        };
    
    justifySubMenusWidth (menu, this._menu.offsetWidth);
    
    var _navigateBackDelegate = Function.createDelegate(this, this.navigateBack);
    var _navigateForwardDelegate = Function.createDelegate(this, this.navigateForward);
    
    this._hideLastChildDelegate = Function.createDelegate(this, this.hideLastChild);
    this.__onAnimationEndedDelegate = Function.createDelegate(this, this._onAnimationEnded);
    
    $addHandler (this._backButton, 'click', _navigateBackDelegate);
    
	menu.add_itemClicking (_navigateForwardDelegate);
	
	menu.add_itemOpening (cancelEvent);
}

iPodMenu.prototype =
{
    animateTransition: function (direction, onAnimationEnded)
    {
        this._animating = true;
        
        var fps = 60;
        
        var startPosition = parseInt($telerik.getCurrentStyle(this._menu, 'left', '0px')) || 0;
        
        var finalPosition = startPosition;
        
        if (direction == Telerik.Web.UI.SlideDirection.Left)
        {
            finalPosition -= this._menu.offsetWidth;
        }
        else
        {
            finalPosition += this._menu.offsetWidth;
        }
        
        var animationSettings = new Telerik.Web.UI.AnimationSettings({'duration' : 500});
        
        var points = Telerik.Web.UI.AnimationFunctions.CalculateAnimationPoints(animationSettings, startPosition, finalPosition, fps);
        
        var animation = new $TWA.DiscreteAnimation(this._menu, 0.5, fps, "style", "left", points);
        
        if (onAnimationEnded)
        {
            animation.add_ended (onAnimationEnded);
        }
        
        animation.add_ended (this.__onAnimationEndedDelegate);
        
        animation.play();
    },
    
    _onAnimationEnded: function ()
    {
        this._animating = false;
    },

    hideLastChild: function ()
    {
        this._lastChild.style.display = "none";
    },

    navigateBack: function (e)
    {
        e.preventDefault();
        
        if (this._animating) return;
        
        this.animateTransition(Telerik.Web.UI.SlideDirection.Right, this._hideLastChildDelegate);
        
        --this._level;
        
        if (this._level == 0)
        {
            this._backButton.style.display = "none";
        }
        
        return false;
    },

    navigateForward: function (sender, args)
    {
        args.set_cancel (true);
        
        if (this._animating) return;
        
        var clickedItem = args.get_item();
        var childList = clickedItem.get_childListElement();
        
        if (childList)
        {   
            // update back button
            
            this._backButton.style.display = "block";
            
            
            // show child list on the right
            
            childList.style.display = "block";
            
            this._lastChild = childList.parentNode;
            
            this._lastChild.style.display = "block";
            this._lastChild.style.left = this._menu.offsetWidth + 'px';
            this._lastChild.style.top = -clickedItem.get_element().offsetTop + 'px';
            
            
            // animate left
            
            this.animateTransition(Telerik.Web.UI.SlideDirection.Left);   
         
            this._level++;
        }
        
        return false;
    }
};

// helper cancelling function
function cancelEvent (sender, args)
{
    args.set_cancel (true);
    
    return false;
}
