var tocRoot, tocBranch, tocSel, tocLoading, tocLastID, tableSel = null, tabHead, data, tocTab, tocInitRoot, tocMemToc,
	rFStatus, oldData, tableSelTable;
var prevPage = "";
var initI;
var icon = new Array();
var preloadIcons =
	new Array(1, 10, 101, 102, 103, 104, 106, 107, 108, 11, 113, 116, 118, 16, 175, 176, 177, 178, 179, 180, 181, 182,
		183, 184, 185, 186, 187, 188, 189, 19, 20, 21, 24, 25, 26, 28, 29, 31, 34, 4, 5, 52, 53, 56, 57, 6, 60, 68, 69,
		7, 8, 82, 9, 99);

var browser = browserCheck();
var content = 0;
var Linkguid = "";

function browserCheck()
{
	browser = navigator.userAgent.toLowerCase();

	if (browser.indexOf('msie') != -1)
	{
		if (browser.substring(browser.indexOf('msie') + 5, browser.indexOf('.', browser.indexOf('msie'))) > 6)
			return ("ie7");

		if (browser.substring(browser.indexOf('msie') + 5, browser.indexOf('.', browser.indexOf('msie'))) > 5)
			return ("ie6");
		else
			return ("ie_old");
	}
	else if (browser.indexOf('firefox') != -1)
		return ("ff");
	else if (browser.indexOf('opera') != -1)
		return ("op");
	else if (browser.indexOf('gecko') != -1)
		return ("ff");
}

function changeCSS(theClass, element, value, target)
{
	var cssRules;
	target = eval(target + '.document.styleSheets');

	if (browser == 'ie6' || browser == 'ie7')
	{
		cssRules = 'rules';
	} else if (browser == 'ff' || browser == 'op')
	{
		cssRules = 'cssRules';
	}

	for (var S = 0; S < target.length; S++)
	{
		for (var R = 0; R < target[S][cssRules].length; R++)
		{
			if (target[S][cssRules][R].selectorText == theClass)
			{
				try
				{
					target[S][cssRules][R].style[element] = value;
				}
				catch (e)
				{
				}
			}
		}
	}
}

function initItem(item)
{
	if (prevPage != cont.document.location.href)
		tableSel = null;

	if (tableSel == null)
	{
		if (cont.document.getElementById('TableGroup') != null)
		{
			toggleItem(cont.document.getElementById('TableGroup').getElementsByTagName('li')[0].id.replace("Title",
				""));
		}

		prevPage = cont.document.location.href;
	}
}

function initLoad(src, toc, home)
{

	var qs = document.location.search.substring(1);

	if (qs.substring(0, qs.indexOf('=')) == 'goto')
	{
		var gotoPage = qs.substring(qs.indexOf('=') + 1).split(':');
		var fExt = home.substring(home.lastIndexOf('.'));
		var home = "./EARoot/";

		for (var i = 0; i < gotoPage.length; i++)
		{
			home += "EA" + gotoPage[i];

			if (i != gotoPage.length - 1)
				home += "/";
			else
				home += fExt;
		}
	}

	content = document.createElement('div');
	content.className = "IndexBody";
	content.innerHTML = "	<iframe src='" + toc + "' name='toc' id='tocIFrame' frameborder='0'></iframe>\n";

	if (qs.substring(0, qs.indexOf('=')) == 'guid')
	{
		Linkguid = qs.substring(qs.indexOf('=') + 1).split('?guid=');
		var sGuid = new String(Linkguid);

		if (sGuid.substring(0, 1) == "{" && sGuid.substring(sGuid.length, sGuid.length - 1) == "}")
			sGuid = sGuid.substring(1, sGuid.length - 1);
		Linkguid = sGuid;
		LoadGuidMap(OnReadyLoadGuidMap);
	} else
	{
		// We don't have a guid in the address bar, so set the default homepage and continue
		content.innerHTML += "	<iframe src='" + home + "' name='cont' id='contentIFrame' frameborder='0'></iframe>";
		content.innerHTML += "	<div id=\"resizeFrames\"></div>";

		// Pass in the guid of the home page or class.
		initPreLoad(content);
	}
}

function LoadGuidMap(ResponseFunc)
{
	// Get the correct file
	var FirstTwoHexDigits = new String(Linkguid);
	FirstTwoHexDigits = FirstTwoHexDigits.slice(0, 2).toLowerCase();
	var src = "js/data/guidmaps/" + "GuidMap" + FirstTwoHexDigits + ".xml";

	RequestPage(src, ResponseFunc); // Request the page passing in the filelocation and the response function.
}

function OnReadyLoadGuidMap()
{
	if (data.readyState == 4)
	{
		try
		{

			var Home = GetPageAddressFromMapString(data.responseText);

			//Set the home page.
			content.innerHTML += "	<iframe src='" + Home + "' name='cont' id='contentIFrame' frameborder='0'></iframe>";
			content.innerHTML += "	<div id=\"resizeFrames\"></div>";

			//Make sure memory for the string is cleared. The browser should do this anyway but just in case.
			Home = null;

			// Continue loading the rest of the page.
			initPreLoad(content);
		}
		catch (e)
		{
			return;
		}
	}
}

function GetPageAddressFromMapString(MapString)
{
	var LG = new String(Linkguid);
	var Page = new String(MapString);

	LG = LG.toLowerCase();             //Make searching case insensitive.
	Page = Page.toLowerCase();

	var Pos1 = Page.search(LG);        // Search the the guid in the string and return the position.
	Page = Page.slice(Pos1);           // Remove the top half of the string.

	var Pos2 = Page.search("/");       //Search for the start of the web address.
	var Pos3 = Page.search(";");       //Search for the end of the web address.
	Page = Page.slice(Pos2 + 1, Pos3); // extract the web address.

	// Leave the page address in the original case as Linux is case sensitive.
	var sExt = ".html";
	Pos1 = Page.search(sExt);

	if (Pos1 == -1)
	{
		sExt = ".htm";
		Pos1 = Page.search(sExt);
	}

	Page = Page.slice(0, Pos1);
	Page = Page.toUpperCase();
	Page = "EARoot/" + Page + sExt; // At the root back onto the page.

	return Page;
}

function guidLink(guid, qs)
{
	guid = guid.substring(1, guid.length - 1); //Remove the brakets
	Linkguid = guid;
	LoadGuidMap(OnReadyGuidLink);
}

function OnReadyGuidLink()
{
	if (data.readyState == 4)
	{
		try
		{
			// Get the page location from the guid map.
			var Page = GetPageAddressFromMapString(data.responseText);

			cont.location = Page;

			//Make sure memory for the string is cleared. The browser should do this anyway but just in case.
			Page = null;
			Linkguid = null;
		}
		catch (e)
		{
			return;
		}
	}
}

function RequestPage(Page, ResponseFunc)
{
	try
	{
		data = new XMLHttpRequest();
		data.onreadystatechange = ResponseFunc;
		data.open("GET", Page, true);
		data.send(null);
	}
	catch (e)
	{
		if (browser == "ie6" || browser == "ie7" || browser == "ie8")
		{
			data = new ActiveXObject("Microsoft.XMLHTTP");
			if (data)
			{
				data.onreadystatechange = ResponseFunc;
				data.open("GET", Page, true);
				data.send();
			}
		} else
		{
			alert(e);
		}
	}
}

function initPage(src)
{
	if (browser == "ie_old")
		return;

	if (toc.document == null)
		toc = top.frames[0];

	if (cont.document == null)
		cont = top.frames[1];

	if (cont.document == null)
	{
		setTimeout("initPage('" + src + "')", "1000");
		return;
	}

	var curPage = cont.document.location + "";

	if (curPage.indexOf('EARoot') != -1)
		curPage = curPage.substring(curPage.indexOf('EARoot'));
	else
		curPage = curPage.substring(curPage.lastIndexOf('/') + 1);

	for (var j = 0; j < cont.document.getElementsByTagName('div').length; j++)
	{
		if (cont.document.getElementsByTagName('div')[j].className == "ObjectDetailsNotes")
		{
			var tmpStr = cont.document.getElementsByTagName('div')[j].innerHTML;
			//tmpStr=tmpStr.replace(/&nbsp;<WBR>/g," "); //GAS 810 - removed as it adversely affect PreserveWS
			tmpStr = tmpStr.replace(/&gt;/g, ">");
			tmpStr = tmpStr.replace(/&lt;/g, "<");
			cont.document.getElementsByTagName('div')[j].innerHTML = tmpStr;
		}
	}

	if (src != null)
		initItem();

	if (curPage.substr(0, curPage.indexOf('.')) == "blank")
		return;

	//Check ToC is loaded
	if (toc.document.body == null)
	{
		setTimeout("initPage('" + src + "')", "1");
		return;
	} else if (toc.document.body.childNodes && toc.document.body.childNodes.length == 1)
	{
		setTimeout("initPage('" + src + "')", "1");
		return;
	} else if (toc.document.body.lastChild && toc.document.body.lastChild.childNodes
		&& toc.document.body.lastChild.childNodes.length == 0)
	{
		setTimeout("initPage('" + src + "')", "1");
		return;
	} else if (!toc.document.body.childNodes || !toc.document.body.lastChild || !toc.document.body.lastChild.childNodes)
	{
		setTimeout("initPage('" + src + "')", "1");
		return;
	}
	else
	{
		if (toc.document.getElementById(curPage) == null)
		{
			return;
		}

		if (toc.document.getElementById(curPage).parentNode.parentNode.parentNode.parentNode
			&& toc.document.getElementById(curPage).parentNode.parentNode.parentNode.parentNode.childNodes.length > 3)
		{
			if (toc.document.getElementById(
				curPage).parentNode.parentNode.parentNode.parentNode.childNodes[toc.document.getElementById(
				curPage).parentNode.parentNode.parentNode.parentNode.childNodes.length - 4].src.indexOf('plus') != -1)
			{
				toc.tocClick(toc.document.getElementById(
					curPage).parentNode.parentNode.parentNode.parentNode.childNodes[toc.document.getElementById(
					curPage).parentNode.parentNode.parentNode.parentNode.childNodes.length - 4]);
			}
		}

		if (toc.document.getElementById(curPage).parentNode.parentNode.childNodes[toc.document.getElementById(
			curPage).parentNode.parentNode.childNodes.length - 4].src.indexOf('plus') != -1)
		{
			toc.tocClick(
				toc.document.getElementById(curPage).parentNode.parentNode.childNodes[toc.document.getElementById(
					curPage).parentNode.parentNode.childNodes.length - 4]);
		}

		if (tocSel)
			tocSel.parentNode.childNodes[tocSel.parentNode.childNodes.length - 2].style.backgroundColor = "";

		//Highlight selected ToC item and store in memory
		if (toc.document.getElementById(curPage))
		{
			tocSel = toc.document.getElementById(curPage).parentNode;
			tocSel.parentNode.childNodes[tocSel.parentNode.childNodes.length - 2].style.backgroundColor = "#B2B4BF";

			if (tocSel.offsetTop < toc.document.body.scrollTop || tocSel.offsetTop > toc.document.body.offsetHeight
				+ toc.document.body.scrollTop)
			{
				toc.scrollTo(0, tocSel.offsetTop - 20);
			}
		}
	}
}

function initPreLoad(content)
{
	var preload = document.getElementById('IndexHeader').parentNode.insertBefore(document.createElement('div'),
		document.getElementById('IndexHeader').nextSibling);
	preload.id = "Preload";
	preload.appendChild(document.createElement('p'));
	preload.firstChild.appendChild(document.createTextNode("Loading..."));

	if (browser == "ie_old")
		return;

	if (browser == "ie6" || browser == "ie7")
		changeCSS('#Preload', 'height', top.document.body.clientHeight - 67 + 'px', 'this');
	else
		changeCSS('#Preload', 'height', top.innerHeight - 67 + 'px', 'this');

	for (var i = 0; i < preloadIcons.length; i++)
	{
		icon[preloadIcons[i]] = new Image();
		icon[preloadIcons[i]].src = "images/" + preloadIcons[i] + ".png";
	}

	var preloader = document.body.appendChild(document.createElement('div'));
	preloader.style.display = "none";
	preloader.id = "preloader";
	preloader.appendChild(content);

	resizeFrames('init');
}

function initPreLoaded()
{
	if (browser == "op")
		setCSS();

	var preloader = document.getElementById('preloader');

	document.getElementById('Preload').parentNode.replaceChild(preloader.firstChild,
		document.getElementById('Preload'));
	preloader.parentNode.removeChild(preloader);

	if (browser != "op")
		setTimeout('setCSS();', '1000');
}

function resizeFrames(str)
{
	var resizeFrames = document.getElementById('resizeFrames');
	if (str == "init")
	{
		resizeFrames.onmousedown = resizeFramesOn;
		resizeFrames.onmouseup = resizeFramesOff;
		resizeFrames.onmouseout = resizeFramesOff;
		resizeFrames.onmousemove = resizeFramesMove;
	}
}

function resizeFramesOn(e)
{
	rFStatus = 1;

	var resizeFrames = document.getElementById('resizeFrames');
	tmpRF = resizeFrames.parentNode.appendChild(document.createElement('div'));
	tmpRF.style.left = (document.getElementById('tocIFrame').clientWidth + 1) + "px";
	tmpRF.id = "tmpRF";
	resizeFrames.style.width = "100%"
	resizeFrames.style.left = "0px";
}

function resizeFramesOff(e)
{
	rFStatus = 0;

	var resizeFrames = document.getElementById('resizeFrames');
	if (document.getElementById('tmpRF') != null)
		document.getElementById('tmpRF').parentNode.removeChild(document.getElementById('tmpRF'));

	resizeFrames.style.width = "5px";
	resizeFrames.style.left = (document.getElementById('tocIFrame').clientWidth + 1) + "px";
}

function resizeFramesMove(e)
{
	if (rFStatus != 0)
	{
		if (rFStatus == 2)
			var posX = e + 2;
		else if (browser == "ff")
			var posX = e.pageX;
		else
			var posX = event.x;

		if (posX <= 150)
			posX = 150;
		else if (posX >= top.document.body.clientWidth / 2)
			posX = top.document.body.clientWidth / 2;

		document.getElementById('contentIFrame').style.left = (posX + 3) + "px";
		document.getElementById('contentIFrame').style.width = (top.document.body.clientWidth - posX - 4) + "px";

		if (document.getElementById('tmpRF') != null)
			document.getElementById('tmpRF').style.left = (posX - 2) + "px";

		if (browser == "ie6")
			document.getElementById('tocIFrame').style.width = (posX - 4) + "px";
		else
			document.getElementById('tocIFrame').style.width = (posX - 3) + "px";

		if (tableSelTable != null)
		{
			if (tableSelTable.childNodes.length > 1 && document.getElementById('tmpRF') != null)
			{
				tableSelTable.style.width = (document.body.clientWidth
					- (document.getElementById('tmpRF').offsetLeft + 6) - 20) + "px";

				if (tableSelTable.childNodes[0].style)
					tableSelTable.childNodes[0].style.width = (tableSelTable.offsetWidth - 19) + "px";

				if (tableSelTable.childNodes[1].style)
					tableSelTable.childNodes[1].style.width = (tableSelTable.offsetWidth - 19) + "px";
			}
		}
	}
}

function resizePage()
{
	if (rFStatus == 1)
		return;
	rFStatus = 2;

	if (document.getElementById('resizeFrames') == null)
		return;

	if (browser == "ie6")
	{
		pHeight = top.document.body.clientHeight;
	} else
	{
		pHeight = top.document.documentElement.clientHeight;
	}

	resizeFramesMove(document.getElementById('resizeFrames').offsetLeft);
	document.getElementById('contentIFrame').style.height = pHeight - 74 + 'px';

	if (browser == "ie7")
	{
		document.getElementById('resizeFrames').style.height = pHeight - 72 + 'px';
		changeCSS('#tmpRF', 'height', pHeight - 72 + 'px', 'this');
	} else
	{
		document.getElementById('resizeFrames').style.height = pHeight - 70 + 'px';
		changeCSS('#tmpRF', 'height', pHeight - 70 + 'px', 'this');
	}
	document.getElementById('tocIFrame').style.height = pHeight - 74 + 'px';
	rFStatus = 0;
}

function setCSS()
{
	if (browser == "ie6")
	{
		pHeight = top.document.body.clientHeight;
	} else
	{
		pHeight = top.document.documentElement.clientHeight;
	}

	if (browser == "ie6" || browser == "ie7")
	{
		changeCSS('.IndexBody', 'width', '', 'this');
		changeCSS('.IndexBody', 'top', '0px', 'this');
		changeCSS('.IndexBody', 'position', 'relative', 'this');
		changeCSS('#contentIFrame', 'height', pHeight - 74 + 'px', 'this');
		changeCSS('#contentIFrame', 'left', '257px', 'this');
		changeCSS('#resizeFrames', 'background', '#000000', 'this');
		changeCSS('#resizeFrames', 'filter', 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)', 'this');
		changeCSS('#resizeFrames', 'height', pHeight - 72 + 'px', 'this');
		changeCSS('#tmpRF', 'border', '0px', 'this');
		changeCSS('#tmpRF', 'height', pHeight - 70 + 'px', 'this');
		changeCSS('#tocIFrame', 'height', pHeight - 74 + 'px', 'this');
	}

	changeCSS('#contentIFrame', 'width', top.document.body.clientWidth - 258 + 'px', 'this');
}

function tocBuild(data)
{

	var tocType = new Array();
	var tocTypes = new Array();
	var tocErrs = new Array();

	for (var i = 0; i < tocTab.length; i++)
	{
		if (!tocTab[i][8])
			tocTab[i][8] = 'misc';

		if (tocTab[i][8].toLowerCase().indexOf('diagram') != -1 && (tocTab[i][6] == "" || tocTab[i][6] == "0"))
			tocTab[i][8] = "0Diagram";

		if (tocTab[i][8].toLowerCase().indexOf('package') != -1)
			tocTab[i][8] = "1Package";

		if (!tocType[tocTab[i][8]])
		{
			tocType[tocTab[i][8]] = new Array();
			tocTypes[tocTypes.length] = tocTab[i][8];
		}
		tocType[tocTab[i][8]][tocType[tocTab[i][8]].length] = i;
	}

	tocTypes.sort();

	for (var i = 0; i < tocTypes.length; i++)
	{
		for (var j = 0; j < tocType[tocTypes[i]].length; j++)
		{
			var build = tocBuildItem(tocType[tocTypes[i]][j]);

			if (build != true)
			{
				build = build.substring(1);
				tocErrs[tocErrs.length] = build;
			}
		}
	}

	var errRuns = 0;
	var errTotal = tocErrs.length;

	while (tocErrs.length != 0)
	{
		if (errNums == tocErrs.length)
		{
			errRuns++;

			if (errRuns > errTotal)
			{
				break;
			}
		}
		var errNums = tocErrs.length;
		var tmp = tocBuildItem(tocErrs.shift());

		if (tmp != true)
		{
			tocErrs[tocErrs.length] = tmp.substring(1);
		}
	}

	while (tocErrs.length != 0)
	{
		tocTab[tocErrs[0]][6] = "0";
		tocBuildItem(tocErrs.shift());
	}

	if (tocLastID != 0)
	{
		var tocLastSrc = document.getElementById("toc"
			+ tocLastID).parentNode.childNodes[document.getElementById("toc" + tocLastID).parentNode.childNodes.length
			- 4];
		tocLastSrc.src = tocLastSrc.src.substring(tocLastSrc.src.lastIndexOf('images')).replace("01", "02");
	}
}

function tocBuildItem(i)
{

	var childItem = false;

	if (tocTab[i][0].indexOf(':') != -1)
		tocBranch = document.getElementById("toc" + tocTab[i][0].substring(0, tocTab[i][0].lastIndexOf(':')));
	else if (tocTab[i][0].indexOf('.') != -1)
		tocBranch = document.getElementById("toc" + tocTab[i][0].substring(0, tocTab[i][0].lastIndexOf('.')));
	else if (tocTab[i][0] != "0")
		tocBranch = document.getElementById("toc0");
	else if (tocTab[i][1] == 3)
		tocBranch = document.getElementById("System").parentNode.lastChild;
	else
		tocBranch = tocRoot;

	//Check if item is child
	if (tocTab[i][5] && tocTab[i][6] && tocTab[i][6] != "0")
	{
		if (document.getElementById(tocTab[i][6]) == null)
			return 'i' + i;
		tocBranch = document.getElementById(tocTab[i][6]).parentNode.lastChild;
		childItem = true;
	}

	tocBranch = tocBranch.appendChild(document.createElement('li'));

	if (tocTab[i][0] != 0 || tocTab[i][1] == 3)
	{
		tocImage = tocBranch.appendChild(document.createElement('img'));

		if (tocTab[i][0].indexOf('.') == -1 && (tocTab[i][0].indexOf(':') == -1 || tocTab[i][0].indexOf('0') == 0))
			tocImage.src = "images/join01.gif";
			else if (tocTab[i][0].indexOf('.') != -1 || tocTab[i][0].indexOf(':') != -1)
		{
			var tocTmp = tocTab[i][0].replace(':', '.');

			for (var m = 0; tocTmp.split('.').length > m + 1; m++)
			{
				if (document.getElementById("toc" + tocTmp.substring(0,
					tocTmp.lastIndexOf('.'))).parentNode.childNodes[m].src.substring(document.getElementById("toc"
					+ tocTmp.substring(0,
						tocTmp.lastIndexOf('.'))).parentNode.childNodes[m].src.lastIndexOf('images')).indexOf('02')
					!= -1 || document.getElementById("toc"
					+ tocTmp.substring(0,
						tocTmp.lastIndexOf('.'))).parentNode.childNodes[m].src.substring(document.getElementById("toc"
					+ tocTmp.substring(0,
						tocTmp.lastIndexOf('.'))).parentNode.childNodes[m].src.lastIndexOf('images')).indexOf('04')
						!= -1)
					tocImage.src = "images/join04.gif";
				else
					tocImage.src = "images/join03.gif";
				tocImage = tocBranch.appendChild(document.createElement('img'));
			}
			tocImage.src = "images/join01.gif";
		}
		tocImage.onclick = function()
		{
			tocClick(this);
		}

		if (tocTab[i][1] == 3)
		{
			tocImage.src = tocImage.src.substring(tocImage.src.lastIndexOf('images')).replace("01", "02");

			if (tocImage.parentNode.parentNode.childNodes.length > 1)
			{
				tocTmp = tocImage.parentNode.previousSibling.childNodes[
					tocImage.parentNode.previousSibling.childNodes.length - 4];
				tocTmp.src = tocTmp.src.substring(tocTmp.src.lastIndexOf('images')).replace("02", "01");
			}
		}

		//Check if item has children data
		if (tocTab[i][1] && tocTab[i][1] != 3)
		{
			tocImage.id = tocTab[i][7];
			tocImage.alt = tocTab[i][7];
		} else if (childItem == true)
		{
			while (tocImage.parentNode.childNodes.length
				< document.getElementById(tocTab[i][6]).parentNode.childNodes.length - 2)
			{
				tocImage.parentNode.insertBefore(document.createElement('img'), tocImage).src = "images/join03.gif";
			}
			tocImage.src = tocImage.src.substring(tocImage.src.lastIndexOf("images")).replace('01', '02');

			if (document.getElementById(tocTab[i][6]).parentNode.lastChild.childNodes.length > 1)
			{
				tocTmpSrc = document.getElementById(
					tocTab[i][6]).parentNode.lastChild.lastChild.previousSibling.childNodes[document.getElementById(
					tocTab[i][6]).parentNode.lastChild.lastChild.previousSibling.childNodes.length - 4];
				tocTmpSrc.src = tocTmpSrc.src.substring(tocTmpSrc.src.lastIndexOf('images')).replace('02', '01');
			}
			tocImage = document.getElementById(
				tocTab[i][6]).parentNode.childNodes[document.getElementById(tocTab[i][6]).parentNode.childNodes.length
				- 4];
			tocImage.parentNode.lastChild.style.display = "none";
		}

		if ((tocTab[i][1] && tocTab[i][1] != 3) || childItem == true)
		{
			tocImage.id = tocImage.id.substr(1, tocImage.id.length - 2);
			tocImage.src = tocImage.src.substring(tocImage.src.lastIndexOf('images')).replace('join', 'plus');
		}
	}

	//Set Icon
	if (tocTab[i][3])
	{
		tocImg = tocBranch.appendChild(document.createElement('a'));
		tocImg.href = tocTab[i][3];
		tocImg.target = top.frames[1].name;
	} else
		tocImg = tocBranch;
	tocTab[i][4] = tocTab[i][4].substring(0, tocTab[i][4].indexOf('.'))

	tocImg = tocImg.appendChild(document.createElement('img'));

	if (top.icon[tocTab[i][4]])
		tocImg.src = top.icon[tocTab[i][4]].src;
	else
		tocImg.src = "images/" + tocTab[i][4] + ".png";

	if (tocTab[i][3])
		tocImg.id = tocTab[i][3];

	//Set Text/Link
	if (tocTab[i][5] && tocTab[i][8] != "0Diagram")
		tocBranch.lastChild.id = tocTab[i][5];
	else
		tocBranch.lastChild.id = "0";
	tocBranch.lastChild.style.marginRight = "4px";

	if (tocTab[i][3])
	{
		tocText = tocBranch.appendChild(document.createElement('a'));
		tocText.href = tocTab[i][3];
		tocText.target = top.frames[1].name;

		if (tocTab[i][9])
			tocText.id = tocTab[i][9];
		else if (tocTab[i][7])
			tocText.id = tocTab[i][7];
	} else
		tocText = tocBranch;
	var j = 0;
	var nodeText;

	//Replace values
	while (tocTab[i][2].indexOf('&quot;') != -1)
		tocTab[i][2] = tocTab[i][2].replace('&quot;', '\"');

	while (tocTab[i][2].indexOf('<br />') != -1)
		tocTab[i][2] = tocTab[i][2].replace('<br />', '\n');

	while (tocTab[i][2].indexOf('&#39;') != -1)
		tocTab[i][2] = tocTab[i][2].replace('&#39;', '\'');

	if (tocTab[i][2] == "")
		tocTab[i][2] = "               ";

	nodeText = tocText.appendChild(document.createTextNode(tocTab[i][2]));

	while (nodeText.nodeValue.indexOf('&lt;') != -1)
		nodeText.nodeValue = nodeText.nodeValue.replace('&lt;', '<');

	while (nodeText.nodeValue.indexOf('&gt;') != -1)
		nodeText.nodeValue = nodeText.nodeValue.replace('&gt;', '>');

	tocBranch.appendChild(document.createElement('ul')).id = "toc" + tocTab[i][0];

	tocLastID = tocTab[i][0];

	return true;
}

function tocClick(tocSrc)
{
	if (tocSrc.src.substring(tocSrc.src.lastIndexOf('images')).indexOf('minus') != -1)
	{

		tocSrc.parentNode.childNodes[tocSrc.parentNode.childNodes.length - 1].style.display = "none";
		tocSrc.src = tocSrc.src.substring(tocSrc.src.lastIndexOf('images')).replace('minus', 'plus');
	}
	else if (tocSrc.src.substring(tocSrc.src.lastIndexOf('images')).indexOf('plus') != -1)
	{
		tocSrc.parentNode.childNodes[tocSrc.parentNode.childNodes.length - 1].style.display = "block";
		tocSrc.src = tocSrc.src.substring(tocSrc.src.lastIndexOf('images')).replace('plus', 'minus');

		//Check if children data built
		if (tocSrc.parentNode.childNodes[tocSrc.parentNode.childNodes.length - 1].childNodes.length == 0)
		{
			tocLoadData(tocSrc.id + ".xml");
		}
	}
}

function tocInit()
{
	if (browser == "ie_old")
	{
		top.document.getElementById(
			'Preload').childNodes[0].innerHTML
			= "<strong>It appears you are using an outdated version of Internet Explorer, please download a later version from <a href=\"http://www.microsoft.com/windows/ie/default.mspx\">Microsoft</a></strong>";
		return;
	}
	tocLoading = document.body.appendChild(document.createElement('div'));
	tocRoot = document.body.appendChild(document.createElement('ul'));
	tocRoot.id = "tocRoot";
	tocInitRoot = 1;
	tocLoadData('root.xml');
}

function tocLoadData(src)
{

	var tmp = document.location + "";
	tmp = tmp.substring(0, tmp.indexOf('toc.'));

	src = tmp + "js/data/" + src;
	tocTab = new Array();

	RequestPage(src, tocLoadDataProcess);
}

function tocLoadDataProcess()
{
	if (data.readyState == 4)
	{
		if (oldData == data)
			return;
		oldData = data;

		try
		{
			eval(data.responseText);
			tocBuild();
			tocInitRoot++;

			if (tocInitRoot == 2)
			{
				tocLoadData(tocTab[0][7].substring(1, tocTab[0][7].length - 1) + ".xml");
			} else if (tocInitRoot == 3 && top.document.getElementById('Preload') != null)
			{
				tocInitRoot = 0;
				top.initPreLoaded();
			}
		}
		catch (e)
		{
			if (top.document.getElementById('Preload') != null)
			{
				var msg =
					"<strong>An error occured while loading data files, please confirm that all files have been generated and are intact.</strong>";

				if (browser == "op")
				{
					msg +=
						"<br\/><br\/><br\/>A possible cause for this error is <strong>'Allow File XMLHttpRequest'</strong> is disabled. This option can be changed via <a href=\"about:config#UserPrefs|AllowFileXMLHttpRequest\">Preferences Editor</a>.<br\/><br\/><i>Note: Ensure you scroll down and click 'save' at the bottom of the page.<\i>";
				}
				top.document.getElementById('Preload').childNodes[0].innerHTML = msg;
			}
			return;
		}
	}
}

function toggleDiv(idDiv, idImage)
{
	var ele = cont.document.getElementById(idDiv);

	if (ele && ele.style.display == "none")
	{
		ele.style.display = "block";
		cont.document.getElementById(idImage).src = cont.document.getElementById(idImage).src.substring(0,
			cont.document.getElementById(idImage).src.lastIndexOf('images'))
			+ cont.document.getElementById(idImage).src.substring(
				cont.document.getElementById(idImage).src.lastIndexOf('images')).replace('plus', 'minus');
	} else if (ele)
	{
		ele.style.display = "none";
		cont.document.getElementById(idImage).src = cont.document.getElementById(idImage).src.substring(0,
			cont.document.getElementById(idImage).src.lastIndexOf('images'))
			+ cont.document.getElementById(idImage).src.substring(
				cont.document.getElementById(idImage).src.lastIndexOf('images')).replace('minus', 'plus');
	}
}

function toggleData(src)
{
	var dataRoot = cont.document.getElementById(src).parentNode.parentNode.parentNode;

	if (cont.document.getElementById(src).src.substring(
		cont.document.getElementById(src).src.lastIndexOf('images')).indexOf('plus') != -1)
		cont.document.getElementById(src).src = cont.document.getElementById(src).src.substring(0,
			cont.document.getElementById(src).src.lastIndexOf('images'))
			+ cont.document.getElementById(src).src.substring(
				cont.document.getElementById(src).src.lastIndexOf('images')).replace('plus', 'minus');
	else
		cont.document.getElementById(src).src = cont.document.getElementById(src).src.substring(0,
			cont.document.getElementById(src).src.lastIndexOf('images'))
			+ cont.document.getElementById(src).src.substring(
				cont.document.getElementById(src).src.lastIndexOf('images')).replace('minus', 'plus');

	for (var i = 0; i < dataRoot.getElementsByTagName('tr').length; i++)
	{
		if (dataRoot.getElementsByTagName('tr')[i].id.indexOf(src)
			!= -1 && cont.document.getElementById(src).src.substring(
				cont.document.getElementById(src).src.lastIndexOf('images')).indexOf('minus')
				!= -1 && dataRoot.getElementsByTagName('tr')[i].getElementsByTagName('td')[1].firstChild != null)
			dataRoot.getElementsByTagName('tr')[i].style.display = "";
		else if (dataRoot.getElementsByTagName('tr')[i].id.indexOf(src) != -1)
			dataRoot.getElementsByTagName('tr')[i].style.display = "none";
	}

	if (cont.document.getElementById('TableGroup') != null)
	{
		toggleItem(tableSel, 2);
	}
}

function toggleItem(item, type)
{
	if (tableSel != null)
	{
		var obj = cont.document.getElementById(tableSel + "Table");

		if (obj != null)
		{
			cont.document.getElementById(tableSel + "Title").style.background = "#FFFFFF";
			cont.document.getElementById(tableSel + "Title").style.color = "#000000";
			obj.style.display = "none";
		}
	}
	tableSel = item;
	tableSelTable = cont.document.getElementById(item + "Table");
	tableSelTitle = cont.document.getElementById(item + "Title");

	tableSelTitle.style.background = "#DDDDDD";
	tableSelTitle.style.color = "#666666";
	tableSelTable.style.display = "block";

	if (browser == "ff" || browser == "op" || browser == "ie7")
	{
		var contWHeight = document.documentElement.clientHeight - 78;
		var contWWidth = cont.document.documentElement.clientWidth;
	} else
	{
		var contWHeight = document.body.clientHeight - 74;
		var contWWidth = document.body.clientWidth - (top.document.getElementById('resizeFrames').offsetLeft + 6);
	}

	if (tableSelTable.id == "LinkedDocumentTable")
		tableSelTable.style.overflow = "scroll";

	if (cont.document.body.offsetHeight - contWHeight > 0)
	{
		if (tableSelTable.id != "LinkedDocumentTable")
			tableSelTable.style.overflow = "scroll";

		if (browser == "ff" || browser == "op")
		{
			tableSelTable.style.height = tableSelTable.offsetHeight
				- (cont.document.body.offsetHeight - cont.innerHeight) - 12 + "px";
		} else
		{

			tableSelTable.style.height = tableSelTable.offsetHeight - (cont.document.body.offsetHeight - contWHeight)
				- 3 + "px";

			if (cont.document.body.offsetWidth > contWWidth || type == null)
			{
				tableSelTable.style.width = contWWidth - 20 + "px";

				if (tableSelTable.getElementsByTagName('table').length != 0)
					tableSelTable.getElementsByTagName(
						'table')[0].style.width = tableSelTable.getElementsByTagName('table')[0].offsetWidth - 18
						+ "px";
			}
		}

		if (tableSelTable.getElementsByTagName('table').length != 0)
		{
			tabHead = tableSelTable.appendChild(tableSelTable.getElementsByTagName('table')[0].cloneNode(true));
			tabHead.style.position = "absolute";

			if (browser == "ff" || browser == "op")
				tabHead.style.width = tableSelTable.offsetWidth + "px";
			tabHead.style.top = tableSelTable.offsetTop + 1 + "px";

			for (var i = 0; i < tabHead.getElementsByTagName('tr').length; i++)
			{
				if (i != 0)
					tabHead.getElementsByTagName('tr')[i].style.display = "none";
			}
		}
	} else if (cont.document.getElementById('TableGroup').offsetHeight
		+ cont.document.getElementById('TableGroup').offsetTop < (contWHeight - 6)
			&& tableSelTable.style.overflow == "scroll")
	{
		if (browser == "ff" || browser == "op")
		{
			tableSelTable.style.height = tableSelTable.offsetHeight
				- (cont.document.body.offsetHeight - cont.innerHeight) - 12 + "px";
		} else
		{
			tableSelTable.style.height = tableSelTable.offsetHeight
				+ ((contWHeight - 8) - (cont.document.getElementById('TableGroup').offsetHeight
					+ cont.document.getElementById('TableGroup').offsetTop)) + "px";
		}
	}

	if (tableSelTable.childNodes.length > 1)
	{
		tableSelTable.style.width = (document.body.clientWidth
			- (top.document.getElementById('resizeFrames').offsetLeft + 6) - 20) + "px";

		if (tableSelTable.childNodes[0].style)
			tableSelTable.childNodes[0].style.width = (tableSelTable.offsetWidth - 19) + "px";

		if (tableSelTable.childNodes[1].style)
			tableSelTable.childNodes[1].style.width = (tableSelTable.offsetWidth - 19) + "px";
	}
}
