// JavaScript Document
	
/* -------------------------------------------------------------------------- */
/*  Set up the TF namespace.                                                  */
/* -------------------------------------------------------------------------- */

var TF = window.TF || {};
	
/* -------------------------------------------------------------------------- */
/*  Functions to initialize and perform the scrolling anchor links.           */
/* -------------------------------------------------------------------------- */

TF.Scroller = function () {

	var stepIncrement = 50;	// The number of pixels that each step moves the window.
	var stepDelay = 10;	// The number of milliseconds between steps.
	var limit = 6 * 1000;	// After 6 seconds the scroll is killed.
	
	var running = false;
	
	/* Recursive scrolling method. Steps through the complete scroll. */

	function scrollStep(to, dest, down) {
	
if(!running || (down && to >= dest) || (!down && to <= dest)) {
	TF.Scroller.killScroll();
	return;
}

if((down && to >= (dest - (2 * stepIncrement))) ||
   (!down && to <= (dest - (2 * stepIncrement)))) {
	stepIncrement = stepIncrement * .55;
}

window.scrollTo(0, to);

// Assign the returned function to a public method.

TF.Scroller.nextStep = callNext(+to + stepIncrement, dest, down);

window.setTimeout(TF.Scroller.nextStep, stepDelay);
	}
	
	/* Create a closure so that scrollStep can be accessed by window.setTimeout(). */
	
	function callNext(to, dest, down) {
	
return function() { scrollStep(to, dest, down); };
	}

	return {
	
nextStep: null,
killTimeout: null,
	
/* Sets up and calls scrollStep. */
	
anchorScroll: function(e, obj) {

	var clickedLink = YAHOO.util.Event.getTarget(e);
	var anchorId = clickedLink.href.replace(/^.*#/, '');
	var target = YAHOO.util.Dom.get(anchorId);
	
	if(target) {
	
YAHOO.util.Event.stopEvent(e);
running = true;

var yCoord = ((YAHOO.util.Dom.getY(target) - 6) < 0) ? 0 : YAHOO.util.Dom.getY(target) - 6;
var currentYPosition = (document.all) ? document.body.scrollTop : window.pageYOffset;
var down = true;
	
if(currentYPosition > yCoord) {
	stepIncrement *= -1;
	down = false;
}
	
// Stop the scroll once the time limit is reached.
	
TF.Scroller.killTimeout = window.setTimeout(TF.Scroller.killScroll, limit);
	
scrollStep(currentYPosition + stepIncrement, yCoord, down);	
	}
},

/* Kill the scroll after a timeout, to prevent an endless loop. */

killScroll: function() {
	window.clearTimeout(TF.Scroller.killTimeout);
	running = false;
	stepIncrement = 50;	
},
	
/* Attach the scrolling method to the links with the class 'scrolling-link'. */

init: function() {

	var links = YAHOO.util.Dom.getElementsByClassName('scrolling-link', 'a');
	YAHOO.util.Event.addListener(links, 'click', TF.Scroller.anchorScroll, TF.Scroller, true);
}
	}

} ();

YAHOO.util.Event.onAvailable('doc', TF.Scroller.init, TF.Scroller, true);	
