function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
};

var tocItemNames = new Array();
function cli_buildTOC(bBuildTOC, iLevel, bHasLevel2, bHasResources, iUID) {
	
	// Begin build TOC
	if(bBuildTOC == 1) {
		
		switch(iLevel) {
			case 1:
				var srcDiv = document.getElementById("cli_content_inner");
				break;
				
			case 2:
				var srcDiv = document.getElementById("cli_level_2");
				break;
				
			case 3:
				var srcDiv = document.getElementById("cli_resources");
				break;
		}
		
		var destDiv = document.getElementById("cli_content_inner"); 
		var contentH2tags = srcDiv.getElementsByTagName("h2");
		
		if(contentH2tags.length == 0) {
			// No h2 tags - exit
			return false;
		}
		
		// Create the level h1 & anchor before the first h2
		var levelTag = document.createElement("h1");
		levelTag.id = "cli_heading_" + iLevel;
		levelTag.className = "cli_toc";
		if (iLevel == 1) {
			levelTag.innerHTML = "Overview";
		} else if (iLevel == 2) {
			if(iUID == 0) {
				levelTag.innerHTML = "In-depth information (Login required)";		
			} else {
				levelTag.innerHTML = "In-depth information";
			}
		} else if (iLevel == 3) {
			levelTag.innerHTML = "Resources";
		}
		levelTag = contentH2tags[0].parentNode.insertBefore(levelTag, contentH2tags[0]);
		
		if(typeof(isIE) == "undefined") {
			var levelAnchor = document.createElement("a");
			levelAnchor.name = "l" + iLevel;
			levelTag.parentNode.insertBefore(levelAnchor, levelTag);
		}
		else {
			// Use InnerHTML instead - IE doesn't see correctly created a elems
			levelTag.innerHTML+= "<a name='l"+iLevel+"'></a>";
		}
		
		// Compile a list of h2 headings
		var h2headings = new Array();
		for(var i = 0; i < contentH2tags.length; i++) {
			h2headings[i] = contentH2tags[i].innerHTML.stripHTML().trim();
			contentH2tags[i].style.display = 'none';
		}
		
		// Create the TOC list
		if (iLevel == 3) {
			var tocList = document.createElement("ul");
		} else {
			var tocList = document.createElement("ol");
		}
		for(var i = 0; i < contentH2tags.length; i++) {
			
			contentH2tags[i].className = "cli_toc";
			
			// Base anchor name based on content level & h2 index		
			var thisH2anchor = "l" + iLevel + "_" + contentH2tags[i].innerHTML.normalise();

			var thisH2text = contentH2tags[i].innerHTML;
			
			// Create the anchor for this h2
			if(typeof(isIE) == "undefined") {
				var thisH2a = document.createElement("a");
				thisH2a.name = thisH2anchor;
				contentH2tags[i].parentNode.insertBefore(thisH2a, contentH2tags[i]);
			}
			else {
				// Use InnerHTML instead - IE doesn't see correctly created a elems
				contentH2tags[i].innerHTML+= "<a name='"+thisH2anchor+"'></a>";
			}
			
			// Add link to this anchor into the TOC list
			var thisLI = document.createElement("li");
			if(iLevel == 2 && iUID == 0) {
				thisH2anchor = "login_prompt";
			}
			thisLI.innerHTML = "<a href='#" + thisH2anchor + "'>" + thisH2text + "</a>";
			tocList.appendChild(thisLI);
			
			// Create the contextual submenu
			var thisH2menu = document.createElement("div");
			thisH2menu.className = "cli_toc_sub";
			//insert the required elems inside div for rounded corners etc
			
			
			var h2headingsTemp = new Array();
			for(var x = 0; x < h2headings.length; x++) {
				if(h2headings[x].normalise() != contentH2tags[i].innerHTML.normalise()) {
					h2headingsTemp[x] = "<a href='#l" + iLevel + "_" + h2headings[x].normalise() + "'>" + h2headings[x] + "</a>";
				}
				else {
					h2headingsTemp[x] = h2headings[x];
				}
			}
			
			var subMenuTable = 	"<table class='cli_toc_sub_table' cellspacing='0' border='0' cellpadding='0'>" +
                                //top corners
                                "<tr>" +
								"<td class='cli_toc_sub_table_top_left'></td>" +
								"<td class='cli_toc_sub_table_top'></td>" +
								"<td class='cli_toc_sub_table_top cli_toc_sub_table_left'></td>" +
								"<td class='cli_toc_sub_table_top_right'></td>" +
								"</tr>" +
								"<tr>" +
								"<td class='cli_toc_sub_table_left' rowspan='2'></td>" +
								"<td class='cli_toc_sub_table_head'>" + thisH2text + "</td>" +
								"<td class='cli_toc_sub_table_meta' rowspan='2'>";
			
			subMenuTable+= "<a href='#top'>Back to top</a><br />";
			subMenuTable+= "<a href='#l1'>Overview</a><br />";
			if(bHasLevel2 && iUID != 0) {
				// Add level 2 link
				subMenuTable+= "<a href='#l2'>In-depth information</a><br />";
			}
			else if(bHasLevel2 && iUID == 0) {
				// Add level 2 text
				subMenuTable+= "<a href='#login_prompt'>In-depth information <span class='cli_toc_desc'>(Login required)</span></a><br />";
			}
			
			if(bHasResources) {
				// Add resources link
				subMenuTable+= "<a href='#l3'>Resources</a><br />";
			} else if (bHasResources && iUID == 0) {
				subMenuTable+= "<a href='#l3'>Resources <span class='cli_toc_desc'>(General Access)</span></a><br />";
			}
			subMenuTable+=		"</td>" +
			                    "<td class='cli_toc_sub_table_right' rowspan='2'></td>" +
								"</tr>";
			subMenuTable+=		"<tr><td class='cli_toc_sub_table_nav'>" + h2headingsTemp.join(" | ") + "</td></tr>";
			//bottom corners
			subMenuTable+=      "<tr>" +
								"<td class='cli_toc_sub_table_bottom_left'></td>" +
								"<td class='cli_toc_sub_table_bottom'></td>" +
								"<td class='cli_toc_sub_table_bottom cli_toc_sub_table_left'></td>" +
								"<td class='cli_toc_sub_table_bottom_right'></td>" +
								"</tr>";
			subMenuTable+=		"</table>";
			
			
			thisH2menu.innerHTML = subMenuTable;
			contentH2tags[i].parentNode.insertBefore(thisH2menu, contentH2tags[i].nextSibling);
		}
		
		// Add the references link to the TOC
		/*
		var refLink = document.createElement("li");
		if(bHasResources && iUID != 0) {
			refLink.innerHTML = "<a href='#references'>References</a>";
		}
		else if(bHasResources && iUID == 0) {
			refLink.innerHTML = "<a href='#login_prompt'>References</a>";
		}
		if(iLevel == 1 && bHasResources && !bHasLevel2) {
			tocList.appendChild(refLink);
		}
		else if(iLevel == 2 && bHasResources) {
			tocList.appendChild(refLink);
		}
		*/
		
		// Build the rest of the TOC
		var tocWrap = document.createElement("div");
		tocWrap.id = "level_"+ iLevel +"_toc";
		tocWrap.className = "cli_toc_wrap";
		//top corners
		var topCorners = document.createElement("span");
		tocWrap.appendChild(topCorners);
		topCorners.className = "cli_toc_top_corners";
		//create the elems to house corners
		var bottomCorners = document.createElement("span");
		bottomCorners.className = "cli_toc_bottom_corners";
		topCorners.appendChild(bottomCorners);		
		var tocInner = document.createElement("div");
		bottomCorners.appendChild(tocInner);
		tocInner.className = "cli_toc_sides";
	
		/*
		if(iLevel == 2 && iUID == 0) {
			// Hide level 2 TOC if user not logged in
			tocWrap.style.display = "none";
		}
		*/
		
		var tocTitle = document.createElement("p");
		if(iLevel == 1) {
			if(iUID != 0) {
				tocTitle.innerHTML = "<a href='#l" + iLevel + "'>Overview</a>";

			} else {
				tocTitle.innerHTML = "<a href='#l" + iLevel + "'>Overview <span class='cli_toc_desc'>(General access)</span></a>";

			}
		} else if (iLevel == 2) {
			if(iUID != 0) {
				tocTitle.innerHTML = "<a href='#l" + iLevel + "'>In-depth information</a>";
			} else {
				tocTitle.innerHTML = "<a href='#login_prompt'>In-depth information <span class='cli_toc_desc'>(Login required)</span></a>";
			}
		} else if (iLevel == 3) {
			if(iUID != 0) {
				tocTitle.innerHTML = "<a href='#l" + iLevel + "'>Resources</a>";
			} else {
				tocTitle.innerHTML = "<a href='#l" + iLevel + "'>Resources <span class='cli_toc_desc'>(General access)</span></a>";
			}
		}
		tocInner.appendChild(tocTitle);
		tocInner.appendChild(tocList);
		
		// Add TOC to content before first H1
		var level1tag = document.getElementById("cli_heading_1");	
		level1tag.parentNode.insertBefore(tocWrap, level1tag);
		
	}
	// End build TOC
	
	if(iLevel == 1 && bHasLevel2) {
		// Go back and build TOC for level 2 content
		cli_buildTOC(bBuildTOC, 2, 1, bHasResources, iUID);
	}
	
	// Move Level 2 content to main content div.
	
	// Extra content will be inserted before book-navigation div (ie at the end of main content)
	var destDiv = document.getElementById("cli_content_inner");
	var contentLastElem = getElementsByClassName("book-navigation", "div", destDiv)[0];
	
	// Move l2 content to main content div
	if(iLevel == 2) {
		var srcDiv = document.getElementById("cli_level_2");
		contentLastElem.parentNode.insertBefore(srcDiv, contentLastElem);
	}
	
	// do it all again for l3
	if ((iLevel == 2 && bHasResources) || (iLevel == 1 && !bHasLevel2 && bHasResources)) {
		// Do it for level 3 now
		cli_buildTOC(bBuildTOC, 3, 1, bHasResources, iUID);
	}
	
	// Move references to main content div
	if(iLevel == 3) {
		var srcDiv = document.getElementById("cli_resources");
		//if we're not logged in, this goes ABOVE L2
		if (!iUID) {
			var contentLastElem = document.getElementById("cli_level_2");
		}
		contentLastElem.parentNode.insertBefore(srcDiv, contentLastElem);
		// attach a 'login only' to the 'more references' link in resources.
		// Get the first elem with the cli_toc class within the cli_resources. Then two siblings down. If the inner html = 'More references', then append 'login only'
		var tocs = srcDiv.getElementsByTagName("div");
		//cycle through the siblings until we hit a p, test if it contains an a
		for (tempNode = srcDiv.childNodes[0]; tempNode != null; tempNode = tempNode.nextSibling) {
			if (tempNode.nodeName == "P") {
				var tempChild = tempNode.firstChild;
				if (tempChild.nodeName == "A") {
					moreLink = tempChild;
					break;
				}
			}
		}
		//console.log(moreLink, moreLink.innerHTML);
		//change this to a regexp that covers all caps combos
		if (moreLink.innerHTML == "More references" && !iUID) {
			moreLink.innerHTML += " <span class='cli_toc_desc'>(Login required)</span>";
		}
	}
	
	if((bHasLevel2) && (iUID == 0 && typeof(loginPromptDisplayed) == "undefined")) {
		// Show log in prompt if anonymous user
		var loginPrompt = document.createElement("div");
		//loginPrompt.className = "cli_toc_login";
		loginPrompt.innerHTML =
			"<a name='login_prompt'></a>" + 
			"<h1 class='cli_toc'>In-depth (Login required)</h1>" +
			"<p class='cli_toc_login'>" +
			"<strong>Access to this information requires free registration.</strong>" +
			"<br /><br />Registration to Clinuvel Photoprotection will provide access to in-depth knowledge on the information topics and reference information; regular access to the site will offer the possibility to discuss these topics, diseases and conditions through direct online contact with the panel of professional experts, and through discussions with other registered users. " +
			"<br />For more information, <a href='" + baseURL + "about/tour'>take a tour</a> of our site." +
			"<br /><br />To register, <a href='" + baseURL + "register'>click here</a>." +
			"</p>";
		
		contentLastElem.parentNode.insertBefore(loginPrompt, contentLastElem);
		loginPromptDisplayed = true;
	}

};