/*
Inlcude <span id="TableOfContents"></span> where the table of contents should be inserted.
The following properties may be set:
	tocClassName - classname and prefix for toc elements, default = "toc"
	contentDivId - id of the div containing content, default = "Content"
	headingLevel - heading level to show in toc, default = "h2"
	preserveHTML - whether to preserve or strip HTML tags witin headings, default = false
	skipFirstHeadings - number of headings to skip at beginning, default = 0
	skipLastHeadings - number of headings to skip at end, default = 0
	minimumHeadings - minimum number of headings required to show toc, default = 3
	showBackLinks - whether to show "Back to Top" links, default = false
	backLinkName - classname for "Back to Top" links, default = "backtotoc"
	backLinkText - text for "Back to Top" links, underscores are replaced with spaces, default = "Back_to_Top"
For example:
	<span id="TableOfContents" class="tocClassName:toc contentDivId:Content headingLevel:h2"></span>
Default style selectors include:
	.toc {  }
	.toc ul {  }
	.toc ul li {  }
	.toc ul li a {  }
	.backtotoc {  }
	.backtotoc a {  }
*/
var oldonload = window.onload;
window.onload = function()
{
	if (typeof(oldonload) == "function") { oldonload(); }
	TableOfContents.init("TableOfContents");
}

var TableOfContents = function(tocPlaceholderId, tocClassName, contentDivId, headingLevel, preserveHTML, skipFirstHeadings, skipLastHeadings, minimumHeadings, showBackLinks, backLinkName, backLinkText)
{
	var tocPlaceholder = document.getElementById(tocPlaceholderId);
	var contentContainer = document.getElementById(contentDivId) || tocPlaceholder.parentNode;
	var headings = contentContainer.getElementsByTagName(headingLevel);
	if (headings.length >= minimumHeadings)
	{
		var toc = document.createElement("div");
		toc.className = tocClassName;
		var target = TableOfContents.createTarget(tocClassName);
		toc.appendChild(target);
		var list = document.createElement("ul");
		toc.appendChild(list);
		toc.list = list;
		for (var i = (0 - skipFirstHeadings), n = (headings.length - skipLastHeadings); i < (n); i++)
		{
			var heading = headings[i];
			// Insert TOC Item
			var headingText = preserveHTML ? heading.innerHTML : heading.innerHTML.replace(/<[^>]*>/g, "");
			var item = TableOfContents.createItem(tocClassName + i, headingText);
			toc.list.appendChild(item);
			// Insert Target
			var target = TableOfContents.createTarget(tocClassName + i);
			heading.parentNode.insertBefore(target, heading);
			// Insert Return Link
			if (showBackLinks && heading.parentNode.lastChild.className != backLinkName)
			{
				var link = TableOfContents.createBackLink(tocClassName, backLinkText, backLinkName);
				heading.parentNode.appendChild(link);
			}
		}
		tocPlaceholder.parentNode.replaceChild(toc, tocPlaceholder);
	}
}

TableOfContents.createTarget = function(id)
{
	var a = document.createElement("a");
	a.tabIndex = -1;
	a.id = id;
	// note: non-empty, non-space text node is required in IE8 (w/ position:absolute required so it doesn't take up space)
	a.appendChild(document.createTextNode("\u00a0"));
	a.style.position = "absolute";
	return a;
}

TableOfContents.createItem = function(id, text)
{
	var li = document.createElement("li");
	var a = document.createElement("a");
	a.href = "#" + id;
	a.appendChild(document.createTextNode(text.replace(/&amp;/g, "&")));
    li.appendChild(a);
	return li;
}

TableOfContents.createBackLink = function(id, text, className)
{
	var div = document.createElement("div");
	div.className = className;
	var a = document.createElement("a");
	a.href = "#" + id;
	a.appendChild(document.createTextNode(text));
    div.appendChild(a);
	return div;
}

TableOfContents.init = function(tocPlaceholderId)
{
	if (document.getElementById && document.getElementsByTagName && document.createElement)
	{
		if (tocPlaceholderId && document.getElementById(tocPlaceholderId))
		{
			// set defaults
			var tocClassName = "toc";
			var contentDivId = "Content";
			var headingLevel = "h2";
			var preserveHTML = false;
			var skipFirstHeadings = 0;
			var skipLastHeadings = 0;
			var minimumHeadings= 3;
			var showBackLinks = false;
			var backLinkName = "backtotoc";
			var backLinkText = "Back_to_Top";
			// get properties from className
			var className = document.getElementById(tocPlaceholderId).className;
			if (className)
			{
				tocClassName = className.match(/\btocClassName:(\w+)\b/i) ? RegExp.$1 : tocClassName;
				contentDivId =  className.match(/\bcontentDivId:(\w+)\b/i) ? RegExp.$1 : contentDivId;
				headingLevel = className.match(/\bheadingLevel:(\w+)\b/i) ? RegExp.$1 : headingLevel;
				preserveHTML = className.match(/\bpreserveHTML:(true|false)\b/i) ? (RegExp.$1 == "true" ? true : false) : preserveHTML;
				skipFirstHeadings = className.match(/\bskipFirstHeadings:(\w+)\b/i) ? RegExp.$1 : skipFirstHeadings;
				skipLastHeadings = className.match(/\bskipLastHeadings:(\w+)\b/i) ? RegExp.$1 : skipLastHeadings;
				minimumHeadings = className.match(/\bminimumHeadings:(\w+)\b/i) ? RegExp.$1 : minimumHeadings;
				showBackLinks = className.match(/\bshowBackLinks:(true|false)\b/i) ? (RegExp.$1 == "true" ? true : false) : showBackLinks;
				backLinkName = className.match(/\bbackLinkName:(\w+)\b/i) ? RegExp.$1 : backLinkName;
				backLinkText = className.match(/\bbackLinkText:(\w+)\b/i) ? RegExp.$1.replace("_", " ") : backLinkText;
			}
			// construct TableOfContents
			new TableOfContents(tocPlaceholderId, tocClassName, contentDivId, headingLevel, preserveHTML, skipFirstHeadings, skipLastHeadings, minimumHeadings, showBackLinks, backLinkName, backLinkText);
		}
	}
}