function setMenuOffset() { 

	//opera Netscape 6 Netscape 4x Mozilla 
	if (window.innerWidth || window.innerHeight){ 
	winwidth = docwidth = window.innerWidth; 
	winheight = docheight = window.innerHeight; 
	} 
	//IE Mozilla 
	if (document.body.clientWidth || document.body.clientHeight){ 
	docwidth = document.body.clientWidth; 
	docheight = document.body.clientHeight; 
	} 
	if (document.body.offsetHeight || document.body.offsetWidth){
	winwidth = document.body.offsetWidth;
	winheight = document.body.offsetHeight;
	}

	var header = document.getElementById('tableofcontents');
	if (!header) return;
	var currentOffset = document.documentElement.scrollTop || document.body.scrollTop; // body for Safari
	var startPos = parseInt(setMenuOffset.initialPos) || 190;
	var desiredOffset = startPos - currentOffset;

	if (desiredOffset < 10)
		desiredOffset = 10;
	if (currentOffset > 190)
	{
		desiredOffset = 10
		header.style.position = 'fixed';
		header.style.top =  '10px';
	} 

	header.style.top = desiredOffset + 'px';
	header.style.maxHeight = docheight - currentOffset - 110 + 'px';

	if (docheight - currentOffset - 100 > winheight)
	{
		header.style.maxHeight = winheight -  desiredOffset + 'px';
	}
	



	var currentLeftOffset = document.documentElement.scrollLeft || document.body.scrollLeft; // body for Safari

	if (docwidth < 1000)
	{
		desiredROffset = ((docwidth - 1000) ) + currentLeftOffset;
	} else {
		desiredROffset = ((docwidth - 1000) ) / 2
	}


	if (desiredROffset != parseInt(header.style.right) )
	{
		header.style.right = desiredROffset + 'px';
	}


}
	
	
function titleCase(string)
	{
		var o_split = string.split(" ");
		//this probably isn't a complete list of words that shouldn't be capitalized
		var special_words = new Array('and', 'the', 'to', 'for', 'is', 'in', 'a', 'at', 'an', 'from', 'by', 'if', 'of');
		for (i=0;i<o_split.length;i++) {
			if (i == 0) {
				//always capitalize the first word
				o_split[i] = titleWord(o_split[i]);
			}
			else /*if(special_words.indexOf(o_split[i]) != null )*/ { 
				o_split[i] = titleWord(o_split[i]);				
			}
		}
		retval = o_split.join(' ');
		return retval;
	}
	
	function titleWord(string)
	{	

		for(j=0; j<string.length; j++)
		{
			if ( string.charAt(j).toUpperCase() != string.charAt(j).toLowerCase() || string.charAt(j) == '&')
				return (string.substring(0,j) + string.charAt(j).toUpperCase() + string.substring(j+1).toLowerCase());
		}
		return string;
	}

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;
}				
function createTOC() {
	var y = document.createElement('div');
	y.id = 'innertoc';
	var a = y.appendChild(document.createElement('span'));
	a.onclick = showhideTOC;
	a.id = 'contentheader';
	a.innerHTML = '<h2><a href="#">Show page contents</a></h2>';
	var z = y.appendChild(document.createElement('div'));
	var toBeTOCced = getElementsByTagNames('h2,h3,h4');
	if (toBeTOCced.length < 2) return false;
	
	/* Insert top link */
	var tmpp = document.createElement('p');
	var tmpa = document.createElement('a');
	tmpa.href = '#top';
	tmpp.className = 'toc';
	tmpa.innerHTML = 'Top';

	tmpp.appendChild(tmpa);
	z.appendChild(tmpp);
	

	for (var i=0;i<toBeTOCced.length;i++) {
		var tmpa = document.createElement('a');
		var tmpp = document.createElement('p');
		tmpa.innerHTML = titleCase(toBeTOCced[i].innerHTML.replace(/(<([^>]+)>)/ig,""));
		tmpp.className = 'toc';
		tmpp.appendChild(tmpa);
		z.appendChild(tmpp);
		if (toBeTOCced[i].nodeName == 'H2')
			tmpp.className += '2';
		if (toBeTOCced[i].nodeName == 'H3')
			tmpp.className += '3';
		if (toBeTOCced[i].nodeName == 'H4')
			tmpp.className += '4';
		var headerId = toBeTOCced[i].id || 'link' + i;
		tmpa.href = '#' + headerId;
		toBeTOCced[i].id = headerId;
		/*
		if (toBeTOCced[i].nodeName == 'H2') {
			tmp.innerHTML = 'Top';
			tmp.href = '#top';
			toBeTOCced[i].id = 'top';
		}
		*/
	}
	return y;
}

var TOCstate = 'none';

function showhideTOC() {
	TOCstate = (TOCstate == 'none') ? 'block' : 'none';
	var newText = (TOCstate == 'none') ? '<h2>Show page contents</h2>' : '<h2>Hide page contents</h2>';
	document.getElementById('contentheader').innerHTML = newText;
	document.getElementById('innertoc').lastChild.style.display = TOCstate;
}


function getStyle(el,styleProp) {
	var x = document.getElementById(el);
	if (x.currentStyle)
		var y = x.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
	return y;
}

window.onload = function () {
ToC =  createTOC();
	if (ToC) {
		document.getElementById('TOC').appendChild(ToC);	
		showhideTOC();
	}



	setMenuOffset.initialPos = getStyle('tableofcontents','top');
	window.onscroll = document.documentElement.onscroll = setMenuOffset;
	window.onresize = document.documentElement.onscroll = setMenuOffset;
	setMenuOffset();
	/* in Moz 1.7.12/FF 1.5 window.onscroll is wiped when you use the mouse wheel while 
	the pointer is NOT above a true page element (ie. when it is above the naked documentElement)
	 ... or something ...
	Of course Safari doesn't accept document.documentElement.onscroll; Op and IE 7 do */

}
