	/* -------------------------------------------------------------------------- */
	/*  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 = 5;	// 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('nav', TF.Scroller.init, TF.Scroller, true);