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;
|
|
}
|
|
}
|