var treeScroller = new TreeScroller();

function TreeScroller() {
	this.container = null;
	this.highlightedNode = null;
	this.computingTimeStep = 10;
	this.computingTime = 500;
	this.animationTimeStep = 10;

	var computingStep = this.computingTimeStep/this.computingTime;
	var computer = null;
	var animator = null;
	var currentStep = 0.0;
	var startOffset = 0;
	var currentOffset = 0;
	var targetOffset = 0;

	this.run = function(aContainer) {
		if (!this.highlightedNode) {
			return false;
		}
		if (!aContainer) {
			return false;
		}
		this.container = aContainer;
		startOffset = this.container.scrollTop;
		targetOffset = getOffsetTopFrom(this.container, this.highlightedNode) - 14;

		var visibleHeight = this.container.clientHeight - 30;
		if (targetOffset > startOffset && targetOffset < startOffset + visibleHeight) {
			return false;
		}

		/*
		* von unten hereinscrollen, bis sichtbar, aber nicht weiter
		*/
		if (targetOffset > startOffset + visibleHeight) {
			targetOffset -= visibleHeight - 14;
		}
		
		computer = window.setInterval('treeScroller.compute()',this.computingTimeStep);
		animator = window.setInterval('treeScroller.animate()',this.animationTimeStep);
	};

	this.compute = function() {
		currentStep += computingStep * Math.PI;
		if (currentStep > Math.PI) {
			window.clearInterval(computer);
			computer = null;
			return;
		}
		var factor = (Math.sin(currentStep-Math.PI/2)+1)/2;
		currentOffset = startOffset + (targetOffset-startOffset) * factor;
	};
	
	this.animate = function() {
		if (!computer) {
			window.clearInterval(animator);
			return;
		}
		this.container.scrollTop = currentOffset;
	};
}

function getOffsetTopFrom(container, child) {
	if (!child.offsetParent) {
		return 0;
	}
	if (child.offsetParent == container) {
		return child.offsetTop;
	}
	else {
		return child.offsetTop + getOffsetTopFrom(container, child.offsetParent);
	}
}

