        /* -------------------------------------------------------------------------- */
        /*  Set up the TF namespace.                                                  */
        /* -------------------------------------------------------------------------- */
        
        var UVALIB = window.UVALIB || {};
        
        /* -------------------------------------------------------------------------- */
        /*  Functions to initialize and perform the scrolling anchor links.           */
        /* -------------------------------------------------------------------------- */
        
        UVALIB.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)) {
                    UVALIB.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.
                
                UVALIB.Scroller.nextStep = callNext(+to + stepIncrement, dest, down);
                
                window.setTimeout(UVALIB.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.
                        UVALIB.Scroller.killTimeout = window.setTimeout(UVALIB.Scroller.killScroll, limit);
                        
                        scrollStep(currentYPosition + stepIncrement, yCoord, down);
                    }
                },
                
                /* Kill the scroll after a timeout, to prevent an endless loop. */
                killScroll: function(){
                    window.clearTimeout(UVALIB.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', UVALIB.Scroller.anchorScroll, UVALIB.Scroller, true);
                }
            }
        }();
        
        //YAHOO.util.Event.on('load',UVALIB.Scroller.init, UVALIB.Scroller, true);
		
		UVALIB.TocMenu = function() {
			
			var TOCstate = 'none';
//			window.onscroll = document.documentElement.onscroll = UVALIB.TocMenu.setMenuOffset;
			var initialTop, initialLeft;
			
			return {
						/* IMPORT TOC AND MAIN NAVIGATION */
				 
				init: function(req) {
				//	var importHeader = document.getElementById('header');
				//	if (!importHeader) return;
				//	importHeader.innerHTML = req.responseText;
					initialTop = YAHOO.util.Dom.getY('TOC');
					initialLeft = YAHOO.util.Dom.getX('TOC');
					var ToC = UVALIB.TocMenu.createTOC();
					if (ToC)
						document.getElementById('TOC').appendChild(ToC);
					UVALIB.TocMenu.setMenuOffset();
					window.onscroll = document.documentElement.onscroll = UVALIB.TocMenu.setMenuOffset;
					UVALIB.Scroller.init();
				//	if (location.hash)
				//		location.hash = location.hash;
				//	document.getElementById('menuLink').onclick = getMainNav;
				//	if (Preferences.showSiteNav && Preferences.showSiteNav == 'yes') {
				//		document.getElementById('menuLink').onclick();
				//	}
				},
				
				/* CREATE TOC */
				
				createTOC: function() {
					var y = document.createElement('div');
					y.id = 'innertoc';
					var a = y.appendChild(document.createElement('span'));
					a.onclick = UVALIB.TocMenu.showhideTOC;
					a.id = 'contentheader';
					a.innerHTML = 'show page contents';
					a.style.cursor = 'pointer';
					var topLink = document.createElement('a');
					topLink.className = 'scrolling-link';
					topLink.href = '#top';
					topLink.id = 'tocTopLink';
					topLink.innerHTML = 'Back to top';
					y.appendChild(topLink);
					var z = y.appendChild(document.createElement('ul'));
					z.onclick = UVALIB.TocMenu.showhideTOC;
					var toBeTOCced = getElementsByTagNames('h2,h3,h4,h5');
					if (toBeTOCced.length < 2) return false;
					
					for (var i=0;i<toBeTOCced.length;i++) {
						var textSrc = toBeTOCced[i];
						var firstNode = textSrc.firstChild;
						if (firstNode.nodeName == 'A')
							textSrc = firstNode;
						var tmp = document.createElement('a');
						tmp.innerHTML = textSrc.innerHTML;
						tmp.className = 'scrolling-link';
						var liEl = document.createElement('li');
						liEl.appendChild(tmp);
						z.appendChild(liEl);
						if (toBeTOCced[i].nodeName == 'H4')
							tmp.className += ' indent';
						if (toBeTOCced[i].nodeName == 'H5')
							tmp.className += ' extraindent';
						var headerId = toBeTOCced[i].id || 'link' + i;		
						tmp.href = '#' + headerId;		
						toBeTOCced[i].id = headerId;
				//		if (toBeTOCced[i].nodeName == 'H2') {
				//			tmp.innerHTML = 'Top';
				//			tmp.href = '#top';
				//			toBeTOCced[i].id = 'top';
				//		}
					}
					return y;
				},
								
				showhideTOC: function() {
					TOCstate = (TOCstate == 'none') ? 'block' : 'none';
					document.getElementById('contentheader').innerHTML = (TOCstate == 'none') ? 'Page contents' : 'Hide page contents';
					document.getElementById('innertoc').lastChild.style.display = TOCstate;
				},
				
				setMenuOffset: function() { 

					var header = document.getElementById('TOC');
				
					if (!header) return;
					var currentOffset = document.documentElement.scrollTop || document.body.scrollTop; // body for Safari
					var startPos = parseInt(initialTop) || 190;
						
					//if(currentOffset <= startPos) return;
					//
					var desiredOffset = startPos - currentOffset;
					if (desiredOffset < 0)
						desiredOffset = 0;
					if(header.style.position != 'fixed') header.style.position = 'fixed';
					if (desiredOffset != parseInt(header.style.top)) {
						header.style.top = desiredOffset + 'px';
						
					}
				//	var currentLeftOffset = document.documentElement.scrollLeft || document.body.scrollLeft; // body for Safari
				//	if (currentLeftOffset != - parseInt(header.style.left))
				//		header.style.left = '-' + currentLeftOffset + 'px';
					header.style.left = initialLeft + 'px';	
					
				}
			}
		}();
		
		YAHOO.util.Event.onAvailable('TOC', UVALIB.TocMenu.init, UVALIB.TocMenu, true);


function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}