tree.js #1

  • //
  • guest/
  • robert_cowham/
  • perforce/
  • API/
  • P4.Net/
  • main/
  • doc/
  • ndoc-mod/
  • tree.js
  • View
  • Commits
  • Open Download .zip Download (7 KB)
/* Copyright  2002 Jean-Claude Manoli [[email protected]]
 *
 * 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');
        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;
        }
}
# Change User Description Committed
#1 6414 Robert Cowham Initial branch
//guest/shawn_hladky/P4.Net/main/doc/ndoc-mod/tree.js
#1 5830 Shawn Hladky P4.Net: reorg to support release branches
//guest/shawn_hladky/P4.Net/doc/ndoc-mod/tree.js
#1 5812 Shawn Hladky P4.Net: More documentation.