var scrollTopPosition = 0;
var autoScrolling = false;
var scrollerElement = document.body; //document.documentElement;
var scrollSpeed = 0;
var lastScrollTop = 0;

function ScrollBody(e)
{
    var wheelDelta = VitaminXP.Element.GetScrollDeltaFromEvent(e) * 30;
	wheelDelta = (wheelDelta > 0) ? 70 : -70;
    scrollTopPosition += wheelDelta;
    
    if(scrollTopPosition < 0) scrollTopPosition = 0;
    try{if(scrollTopPosition > scrollerElement.scrollHeight - scrollerElement.clientHeight) scrollTopPosition = scrollerElement.scrollHeight - scrollerElement.clientHeight + 10;}catch(ex){}
    
    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;
        scrollSpeed = (speed > scrollSpeed) ? scrollSpeed + 4 : speed;
		
		lastScrollTop = scrollerElement.scrollTop;
		
        scrollerElement.scrollTop = (scrollTopPosition > scrollerElement.scrollTop) ? scrollerElement.scrollTop + scrollSpeed : scrollerElement.scrollTop - scrollSpeed;
        
        if(lastScrollTop != scrollerElement.scrollTop)
        {
            setTimeout(ProcessVScroll, 10);
        }
        else
        {
            autoScrolling = false;
			scrollSpeed = 0;
            scrollTopPosition = scrollerElement.scrollTop;
        }
    }
}

function RegisterWheelScrollEvent()
{
	// Detect the correct element to scroll
    scrollerElement = document.body;
    var v1 = scrollerElement.scrollTop;
    
    scrollerElement.scrollTop += 1;
    
    if(scrollerElement.scrollTop == v1)
		scrollerElement = document.documentElement;
	else
		scrollerElement.scrollTop -= 1;
    
    // register event
    AddEventHandler(scrollerElement, "MouseScroll", ScrollBody, true);
    
    // set current position variable to actual position
    if(scrollTopPosition == 0) scrollTopPosition = scrollerElement.scrollTop;
}

var AddEventHandler = function(obj, eventType, func, useEventCapture)
{
	try
	{
	    if(eventType.toLowerCase() == "mousescroll") eventType = "mousewheel";
	    
		if (obj.addEventListener)
		{
		    if(!obj.addEventListener(eventType, func, useEventCapture))
		    {
		        var eventName = eventType;
		        if(eventName.toLowerCase() == "mousewheel") eventName = "MouseScroll";
		        
		        if(!obj.addEventListener("DOM"+eventName, func, useEventCapture))
		        {
		            //obj["on" + eventType] = func;
		        }
		    }
		}
		else if(obj.attachEvent)
		{
			obj.attachEvent("on" + eventType, func);
		}
		else
		{
		    obj["on" + eventType] = func;
		}
	}
	catch(exeption)
	{
		VitaminXP.Exception(exception, "VitaminXP.Event.AddEvent");
	}
}

VitaminXP.StartUp("RegisterWheelScrollEvent();");
