var scrollTopPosition = 0;
var autoScrolling = false;
var scrollerElement = document.body; //document.documentElement;

// Functions
function ScrollBody(e)
{
    var wheelDelta = VitaminXP.Element.GetScrollDeltaFromEvent(e) * 30;
    scrollTopPosition += wheelDelta;
    
    if(scrollTopPosition < 0) scrollTopPosition = 0;
    
    if(!autoScrolling)
    {
        autoScrolling = true;
        ProcessVScroll();
    }
}

function ProcessVScroll()
{
    if(scrollTopPosition > scrollerElement.scrollTop - 1 && scrollTopPosition < scrollerElement.scrollTop + 1)
    {
        scrollerElement.scrollTop = scrollTopPosition;
        autoScrolling = false;
    }
    else
    {
        var speed = (Math.abs(scrollTopPosition - scrollerElement.scrollTop) / 10 > 0.1) ? (Math.max(scrollTopPosition, scrollerElement.scrollTop) - Math.min(scrollTopPosition, scrollerElement.scrollTop)) / 10 : 1;
        var lastScrollTop = scrollerElement.scrollTop;
        
        scrollerElement.scrollTop = (scrollTopPosition > scrollerElement.scrollTop) ? scrollerElement.scrollTop + speed : scrollerElement.scrollTop - speed;
        
        if(lastScrollTop != scrollerElement.scrollTop)
        {
            setTimeout(ProcessVScroll, 10);
        }
        else
        {
            autoScrolling = false;
            scrollTopPosition = scrollerElement.scrollTop;
        }
    }
}

function RegisterWheelScrollEvent()
{
    // Detect the correct element to scroll
    var v1 = document.documentElement.scrollTop;
    document.documentElement.scrollTop += 1;
    
    if(v1 + 1 == document.documentElement.scrollTop)
    {
        scrollerElement = document.documentElement;
        scrollerElement.scrollTop -= 1;
    }
    
    // register event
    VitaminXP.Element.AddEvent(scrollerElement, "MouseScroll", ScrollBody, true);
    
    // set current position variable to actual position
    if(scrollTopPosition == 0)scrollTopPosition = scrollerElement.scrollTop;
}

VitaminXP.StartUp("RegisterWheelScrollEvent();");