265 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Copyright © 2002 Jean-Claude Manoli [jc@manoli.net]
 | |
|  *
 | |
|  * This software is provided 'as-is', without any express or implied warranty.
 | |
|  * In no event will the author(s) be held liable for any damages arising from
 | |
|  * the use of this software.
 | |
|  * 
 | |
|  * Permission is granted to anyone to use this software for any purpose,
 | |
|  * including commercial applications, and to alter it and redistribute it
 | |
|  * freely, subject to the following restrictions:
 | |
|  * 
 | |
|  *   1. The origin of this software must not be misrepresented; you must not
 | |
|  *      claim that you wrote the original software. If you use this software
 | |
|  *      in a product, an acknowledgment in the product documentation would be
 | |
|  *      appreciated but is not required.
 | |
|  * 
 | |
|  *   2. Altered source versions must be plainly marked as such, and must not
 | |
|  *      be misrepresented as being the original software.
 | |
|  * 
 | |
|  *   3. This notice may not be removed or altered from any source distribution.
 | |
|  */ 
 | |
| 
 | |
| var treeSelected = null; //last treeNode clicked
 | |
| 
 | |
| //pre-load tree nodes images
 | |
| var imgPlus = new Image();
 | |
| imgPlus.src="treenodeplus.gif";
 | |
| var imgMinus = new Image();
 | |
| imgMinus.src="treenodeminus.gif";
 | |
| var imgDot = new Image();
 | |
| imgPlus.src="treenodedot.gif";
 | |
| 
 | |
| 
 | |
| function findNode(el)
 | |
| {
 | |
| // Takes element and determines if it is a treeNode.
 | |
| // If not, seeks a treeNode in its parents.
 | |
| 	while (el != null)
 | |
| 	{
 | |
| 		if (el.className == "treeNode")
 | |
| 		{
 | |
| 			break;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			el = el.parentNode;
 | |
| 		}
 | |
| 	}
 | |
| 	return el;
 | |
| }
 | |
| 
 | |
| 
 | |
| function clickAnchor(el)
 | |
| {
 | |
| // handles click on a TOC link
 | |
| //
 | |
| 	expandNode(el.parentNode);
 | |
| 	selectNode(el.parentNode);
 | |
| 	el.blur();
 | |
| }
 | |
| 
 | |
| 
 | |
| function selectNode(el)
 | |
| {
 | |
| // Un-selects currently selected node, if any, and selects the specified node
 | |
| //
 | |
| 	if (treeSelected != null)
 | |
| 	{
 | |
| 		setSubNodeClass(treeSelected, 'A', 'treeUnselected');
 | |
| 	}
 | |
| 	setSubNodeClass(el, 'A', 'treeSelected');
 | |
| 	treeSelected = el;
 | |
| }
 | |
| 
 | |
| 
 | |
| function setSubNodeClass(el, nodeName, className)
 | |
| {
 | |
| // Sets the specified class name on el's first child that is a nodeName element
 | |
| //
 | |
| 	var child;
 | |
| 	for (var i=0; i < el.childNodes.length; i++)
 | |
| 	{
 | |
| 		child = el.childNodes[i];
 | |
| 		if (child.nodeName == nodeName)
 | |
| 		{
 | |
| 			child.className = className;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| function expandCollapse(el)
 | |
| {
 | |
| //	If source treeNode has child nodes, expand or collapse view of treeNode
 | |
| //
 | |
| 	if (el == null)
 | |
| 		return;	//Do nothing if it isn't a treeNode
 | |
| 		
 | |
| 	var child;
 | |
| 	var imgEl;
 | |
| 	for(var i=0; i < el.childNodes.length; i++)
 | |
| 	{
 | |
| 		child = el.childNodes[i];
 | |
| 		if (child.src)
 | |
| 		{
 | |
| 			imgEl = child;
 | |
| 		}
 | |
| 		else if (child.className == "treeSubnodesHidden")
 | |
| 		{
 | |
| 			child.className = "treeSubnodes";
 | |
| 			imgEl.src = "treenodeminus.gif";
 | |
| 			break;
 | |
| 		}
 | |
| 		else if (child.className == "treeSubnodes")
 | |
| 		{
 | |
| 			child.className = "treeSubnodesHidden";
 | |
| 			imgEl.src = "treenodeplus.gif";
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| function expandNode(el)
 | |
| {
 | |
| //	If source treeNode has child nodes, expand it
 | |
| //
 | |
| 	var child;
 | |
| 	var imgEl;
 | |
| 	for(var i=0; i < el.childNodes.length; i++)
 | |
| 	{
 | |
| 		child = el.childNodes[i];
 | |
| 		if (child.src)
 | |
| 		{
 | |
| 			imgEl = child;
 | |
| 		}
 | |
| 		if (child.className == "treeSubnodesHidden")
 | |
| 		{
 | |
| 			child.className = "treeSubnodes";
 | |
| 			imgEl.src = "treenodeminus.gif";
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| function syncTree(href)
 | |
| {
 | |
| // Selects and scrolls into view the node that references the specified URL
 | |
| //
 | |
| 	var loc = new String();
 | |
| 	loc = href;
 | |
| 	if (loc.substring(0, 7) == 'file://')
 | |
| 	{
 | |
| 		loc = 'file:///' + loc.substring(7, loc.length);
 | |
| 		loc = loc.replace(/\\/g, '/');
 | |
| 	}
 | |
| 	
 | |
| 	var base = loc.substr(0, loc.lastIndexOf('/') + 1);
 | |
| 	
 | |
| 	var tocEl = findHref(document.getElementById('treeRoot'), loc, base);
 | |
| 	if (tocEl != null)
 | |
| 	{
 | |
| 		selectAndShowNode(tocEl);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function findHref(node, href, base)
 | |
| {
 | |
| // find the <a> element with the specified href value
 | |
| //
 | |
| 	var el;
 | |
| 	var anchors = node.getElementsByTagName('A');
 | |
| 	for (var i = 0; i < anchors.length; i++)
 | |
| 	{
 | |
| 		el = anchors[i];
 | |
| 		var aref = new String();
 | |
| 		aref = el.getAttribute('href');
 | |
| 		
 | |
| 		if ((aref.substring(0, 7) != 'http://') 
 | |
| 			&& (aref.substring(0, 8) != 'https://')
 | |
| 			&& (aref.substring(0, 7) != 'file://'))
 | |
| 		{
 | |
| 			aref = base + aref;
 | |
| 		}
 | |
| 		
 | |
| 		if (aref == href)
 | |
| 		{
 | |
| 			return el;
 | |
| 		}
 | |
| 	}
 | |
| 	return null;
 | |
| }
 | |
| 
 | |
| function selectAndShowNode(node)
 | |
| {
 | |
| // Selects and scrolls into view the specified node
 | |
| //
 | |
| 	var el = findNode(node);
 | |
| 	if (el != null) 
 | |
| 	{
 | |
| 		selectNode(el);
 | |
| 		do 
 | |
| 		{
 | |
| 			expandNode(el);
 | |
| 			el = findNode(el.parentNode);
 | |
| 		} while ((el != null))  
 | |
| 		
 | |
| 		//vertical scroll element into view
 | |
| 		var windowTop;
 | |
| 		var windowBottom;
 | |
| 		var treeDiv = document.getElementById('tree');
 | |
| 		
 | |
| 		var ua = window.navigator.userAgent.toLowerCase();
 | |
| 		if ((i = ua.indexOf('msie')) != -1)
 | |
| 		{
 | |
| 			windowTop = node.offsetTop - treeDiv.scrollTop;
 | |
| 			windowBottom = treeDiv.clientHeight - windowTop - node.offsetHeight;
 | |
| 		}
 | |
| 		else if (ua.indexOf('gecko') != -1)
 | |
| 		{
 | |
| 			windowTop = node.offsetTop - treeDiv.offsetTop - treeDiv.scrollTop;
 | |
| 			windowBottom = treeDiv.clientHeight - windowTop - node.offsetHeight;
 | |
| 		}
 | |
| 		else 
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		if (windowTop < 0)
 | |
| 		{
 | |
| 			treeDiv.scrollTop += windowTop - 18;
 | |
| 			return;
 | |
| 		}
 | |
| 		if (windowBottom < 0)
 | |
| 		{
 | |
| 			treeDiv.scrollTop -= windowBottom - 18;
 | |
| 			return;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| function resizeTree()
 | |
| {
 | |
| 	//var treeDiv = document.getElementById('tree');
 | |
| 	//treeDiv.setAttribute('style', 'width: ' + document.body.offsetWidth + 'px; height: ' + (document.body.offsetHeight - 27) + 'px;');
 | |
| 	//treeDiv.style.width = document.documentElement.offsetWidth;
 | |
| 	//treeDiv.style.height = document.documentElement.offsetHeight - 27;
 | |
| 	
 | |
| 	var treeDiv = document.getElementById('tree');
 | |
|        if(!window.innerHeight)
 | |
|        {
 | |
|                 // IE method
 | |
|                 treeDiv.style.width = document.documentElement.offsetWidth;
 | |
|                 treeDiv.style.height = document.documentElement.offsetHeight - 27;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|                 // Netscape/Firefox method
 | |
|                 treeDiv.style.width = window.innerWidth;
 | |
|                 treeDiv.style.height = window.innerHeight - 27;
 | |
|         }
 | |
| }
 |