﻿////////////////////////////HOLD SCROLL////////////////////////////
var scrollRepeat = null;
var scrollDistance = 0;
var scrollDirection = 0;
var scrollDirection = 0;
var scrollDiv = null;

function uberScrollBeginHold(distanceToScroll, planeOfScroll, divToScroll)
{
    scrollDistance = distanceToScroll;
    scrollDirection = planeOfScroll;
    scrollDiv = divToScroll;
    scrollRepeat = setInterval('uberScrollRunHold()', 30);
}

function uberScrollEndHold()
{
    clearInterval(scrollRepeat);
    scrollRepeat = null;
}

function uberScrollRunHold()
{
    if (scrollDirection == 1)
        document.getElementById(scrollDiv).scrollLeft -= scrollDistance;
    else if (scrollDirection == 2)
        document.getElementById(scrollDiv).scrollTop += scrollDistance;
}
//////////////////////////END HOLD SCROLL//////////////////////////

////////////////////////////TAP SCROLL/////////////////////////////
var tapDiv = new Array();
var tapMovement = new Array();
var tapDirection = new Array();
var tapTarget = new Array();
var tapRepeat = null;

function uberScrollTap(distanceToScroll, planeOfScroll, divToScroll)
{
    var foundMatch = false;
    for (var i = 0; i < tapDiv.length; i++)
    {
        if (tapDiv[i] == divToScroll)
        {
            foundMatch = true;
            break;
        }
    }

    if (!foundMatch)
    {
        tapDiv[tapDiv.length] = divToScroll;
        tapMovement[tapDiv.length - 1] = new uberScrollSmooth(0, 0);
        tapDirection[tapDiv.length - 1] = planeOfScroll;
        tapTarget[tapDiv.length - 1] = distanceToScroll;
    }

    for (var i = 0; i < tapDiv.length; i++)
    {
        if(tapMovement[i].getPosition() < 0)
        {
            distanceToScroll = 0;
            tapMovement[i] = new uberScrollSmooth(0, 0);
            tapTarget[i] = 0;
        }
    }

    for (var i = 0; i < tapDiv.length; i++)
    {
        if (tapDiv[i] == divToScroll)
        {
            tapDirection[i] = planeOfScroll;
            tapTarget[i] = tapMovement[i].getTarget() + distanceToScroll;
        
            if (tapRepeat == null)
            {
                tapMovement[i] = new uberScrollSmooth(tapMovement[i].getPosition(), tapTarget[i]);
                tapRepeat = setInterval('uberScrollRunTap()', 30);
            }
        }
    }
}

function uberScrollRunTap()
{
    for (var i = 0; i < tapDiv.length; i++)
    {
        tapMovement[i].changeTarget(tapTarget[i]);
        tapMovement[i].updateposition();
    
        if (tapDirection[i] == 1)
            document.getElementById(tapDiv[i]).scrollLeft = tapMovement[i].getPosition();
        else if (tapDirection[i] == 2)
            document.getElementById(tapDiv[i]).scrollTop = tapMovement[i].getPosition();
    }
    
    var allStopped = true;
    for (var i = 0; i < tapDiv.length; i++)
    {
        if (!tapMovement[i].hasStopped())
            allStopped = false;
    }
    
    if (allStopped)
    {
        clearInterval(tapRepeat);
        tapRepeat = null;
    }
}

function uberScrollSmooth(position, target, velocity)
{
    position = Math.round(position);
    target   = Math.round(target);
    velocity = (velocity ? Math.round(velocity) : 0);

    this.updateposition = function()
    {
        position += velocity;
        if (velocity < 0)
        {
            if (position - velocity * (velocity  - 1) / 2 < target)
                velocity++;
            else if (position - (velocity - 1) * (velocity - 2) / 2 >= target)
                velocity--;
        }
        else
        {
            if (position + velocity * (velocity + 1) / 2 > target)
                velocity--;
            else if (position + (velocity + 1) * (velocity + 2) / 2 <= target)
                velocity++;
        }

        return position;
    }
  
    this.changeTarget = function(newtarget)
    {
        target = Math.round(newtarget);
    }
    
    this.getTarget = function()
    {
        return target;
    }
  
    this.getPosition = function()
    {
        return position;
    }

    this.getVelocity = function()
    {
        return velocity;
    }
  
    this.hasStopped = function()
    {
        return (position == target && velocity == 0);
    }
}
//////////////////////////END TAP SCROLL///////////////////////////
