/**
 * This should be part of the language, but isn't.
 */
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };

/**
 * Create a floating or fixed navigation widget based on the headers on the page.
 * rand.
 */
var Navigator = {
	pageContentsShown:'  -  PAGE CONTENTS',
	pageContentsHidden:' +  PAGE CONTENTS',
	adjustPosition:false,
	adjustPositionMax:4,
	navId:'rNavigator',
	classNames:'rTranslucent',

	autoAdjust:function() {
		var topValue = Navigator.adjustPositionMax - document.documentElement.scrollTop;
		topValue = (10<topValue?topValue:10);
		var navigator = document.getElementById( Navigator.navId );
		navigator.style.top = topValue + 'px';
	},

	setupAutoAdjust:function() {
		Events.addListener( window, 'scroll', Navigator.autoAdjust );
	},

	toggleNavigator:function( e ) {
		var navigator = document.getElementById( Navigator.navId );
		if( 1 == navigator.getAttribute( 'collapsed' )) {
			navigator.setAttribute( 'collapsed', 0 );
			navigator.style.height='';
			navigator.firstChild.nodeValue = Navigator.pageContentsShown;
		} else {
			navigator.setAttribute( 'collapsed', 1 );
			navigator.style.height='1.2em';
			navigator.firstChild.nodeValue = Navigator.pageContentsHidden;
		}
	},
	
	getNodeTextParent:function( node ) {
		var response = '';
		switch( node.nodeType ) {
			case 1:
				if( node.childNodes ) {
					for( var i=0; i<node.childNodes.length; ++i ) {
						response += Navigator.getNodeTextParent( node.childNodes[i]);
					}
				}
				break;
			case 3:
				if( 0 < node.nodeValue.trim().length ) {
					response += node.nodeValue;
				}
				break;
		}
		return response;
	},
	
	getNodeText:function( node ) {
		if( 3 == node.nodeType ) return Navigator.getNodeTextParent( node.parentNode );
		else return Navigator.getNodeTextParent( node );
	},
	
	hCount:0,
	addNavigatorLink:function( navigator, indent, elt ) {
		var newl = document.createElement( 'br' );
		var ind = '';
		for( var i=0; i<indent; ++i ) ind += '_';
		var text = document.createTextNode( ind + Navigator.getNodeText( elt.firstChild ));
		var link = document.createElement( 'a' );
		var linkName = 'hLink_' + Navigator.hCount++;
		link.setAttribute( 'href', ( '#' + linkName ));
		link.appendChild( text );
		navigator.appendChild( newl );
		navigator.appendChild( link );
		var anchor = document.createElement( 'a' );
		anchor.id = linkName;
		elt.appendChild( anchor );
	},
	addNavigatorLinks:function( navigator, elt ) {
		switch( elt.nodeType ) {
			case 1:
				switch( elt.nodeName.toLowerCase()) {
					case 'h1':	Navigator.addNavigatorLink( navigator, 0, elt ); break;
					case 'h2':	Navigator.addNavigatorLink( navigator, 1, elt ); break;
					case 'h3':	Navigator.addNavigatorLink( navigator, 2, elt ); break;
					case 'h4':	Navigator.addNavigatorLink( navigator, 3, elt ); break;
					case 'h5':	Navigator.addNavigatorLink( navigator, 4, elt ); break;
					case 'h6':	break;
					default:	break;
				}
				for( var i=0; i<elt.childNodes.length; ++i ) {
					Navigator.addNavigatorLinks( navigator, elt.childNodes[i]);
				}
			default:	break;
		}
	},
	setNavigator:function() {
//		if( !document.getElementById ) return;
//		if( !document.getElementsByTagName ) return;
		var body = document.getElementsByTagName( 'body' )[0];
		var navigator = document.createElement( 'div' );
		navigator.setAttribute( 'id', Navigator.navId );
		navigator.className = Navigator.classNames;
		var navTitle = document.createTextNode( 'top' );
		navigator.appendChild( navTitle );
//		var navBreak = document.createElement( 'br' ); // probably not necessary now
//		navigator.appendChild( navBreak );
		body.insertBefore( navigator, body.firstChild );
		Events.addListener( navigator, 'click', Navigator.toggleNavigator );
		var navigatorDiv = document.createElement( 'div' );
		navigator.appendChild( navigatorDiv );
		Navigator.addNavigatorLinks( navigatorDiv, body );
		navigator.setAttribute( 'collapsed', 0 );
		Navigator.toggleNavigator();
		if( Navigator.adjustPosition ) Navigator.setupAutoAdjust();
	}
};

/**
 * Start the menu creation piece
 */
Events.addListener( window, 'load', Navigator.setNavigator );

