function MarcatoScroller()
{
	var element = null;
	var timer = null;
	var timerInterval = 30;
	var startForce = 2.0;
	var friction = 0.4;
	var maxVelocity = 30.0;
	var force = 0.0;
	var velocity = 0.0;
	var distance = 0.0;
	var pos = [0.0, 0.0];
	var direction = [0.0, 0.0];

	var findElementPos = function (elemFind)
	{
		var elemX = 0;
		var elemY = 0;
		do {
			elemX += elemFind.offsetLeft;
			elemY += elemFind.offsetTop;
			elemFind = elemFind.offsetParent;
		} while (elemFind);

		return [elemX, elemY];
	};

	var scroller = function ()
	{
		velocity += force - friction;
		if (velocity > maxVelocity)
		{
			velocity = maxVelocity;
		}
		else if (velocity < 0.0)
		{
			velocity = 0.0;
			if (force === 0.0)
			{
				clearInterval(timer);
				timer = null;
			}
		}

		distance -= velocity;
		if (distance < 0.0)	// Overshot target
		{
			velocity += distance;
			distance = 0.0;
		}

		pos[0] += velocity * direction[0];
		pos[1] += velocity * direction[1];
		element.scrollLeft  = Math.round(pos[0]);
		element.scrollTop = Math.round(pos[1]);

		// Stop forcing to create smooth stopping effect
		if (force > 0)
		{
			// Use (velocity-friction/2) to account for digitization 
			var v_avg = velocity - friction / 2;
			var stoppingDistance = (v_avg * v_avg) / (2 * friction);
			if (distance < stoppingDistance)
			{
				force = 0;
			}
		}
	};

	this.scrollTo = function (scrollArea, scrollToElement, offsetElement, navItem)
	{
		var scroll = document.getElementById(scrollArea);
		var elementPos = findElementPos(document.getElementById(scrollToElement));
		var offsetPos = findElementPos(document.getElementById(offsetElement));
		var scrollPos = [];
		scrollPos[0] = elementPos[0] - offsetPos[0];
		scrollPos[1] = elementPos[1] - offsetPos[1];

		if (timer !== null)
		{
			clearInterval(timer);
			timer = null;
		}

		element = document.getElementById(scrollArea);
		pos[0] = element.scrollLeft;
		pos[1] = element.scrollTop;

		force = startForce;
		var x = scrollPos[0] - pos[0];
		var y = scrollPos[1] - pos[1];
		var r = Math.sqrt(x * x + y * y);
		if (r > 0)
		{
			distance = r;
			direction[0] = x / r;
			direction[1] = y / r;
			timer = setInterval(scroller, timerInterval);
		}

		var children = navItem.parentNode.childNodes;
		for (var i = 0; i < children.length; i = i + 1)
		{
			if (children[i].tagName === navItem.tagName)
			{
				children[i].className = "";
			}
		}
		navItem.className = "selected";
	};

}

var marcatoScroller = new MarcatoScroller();

