Initial commit
This commit is contained in:
@@ -0,0 +1,580 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2000, 2004 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
// Common scripts for IE and Mozilla.
|
||||
|
||||
var isMozilla = navigator.userAgent.indexOf('Mozilla') != -1 && parseInt(navigator.appVersion.substring(0,1)) >= 5;
|
||||
var isIE = navigator.userAgent.indexOf('MSIE') != -1;
|
||||
|
||||
var oldActive;
|
||||
var oldActiveClass = "";
|
||||
|
||||
|
||||
// Preload images
|
||||
// **********************************************************
|
||||
// Note: code moved into the jsp, for dynamic image preferences
|
||||
|
||||
/**
|
||||
* Returns the target node of an event
|
||||
*/
|
||||
function getTarget(e) {
|
||||
var target;
|
||||
if (isMozilla)
|
||||
target = e.target;
|
||||
else if (isIE)
|
||||
target = window.event.srcElement;
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next tree node "down" from current one
|
||||
*/
|
||||
function getNextDown(node)
|
||||
{
|
||||
var a = getAnchorNode(node);
|
||||
if (!a) return null;
|
||||
|
||||
// Try visible child first
|
||||
var li = a.parentNode;
|
||||
var ul = getChildNode(li, "UL");
|
||||
if (ul && ul.className == "expanded")
|
||||
return getDescendantNode(ul, "A");
|
||||
|
||||
// Try next sibling
|
||||
var li_sib = getNextSibling(li);
|
||||
if (li_sib != null)
|
||||
return getDescendantNode(li_sib, "A");
|
||||
|
||||
// Try looking to parent's sibling
|
||||
while(li_sib == null) {
|
||||
var ul = li.parentNode;
|
||||
li = ul.parentNode;
|
||||
if (li.tagName != "LI") // reached the top, nothing else to do
|
||||
return null;
|
||||
|
||||
li_sib = getNextSibling(li);
|
||||
}
|
||||
|
||||
// found the next down sibling
|
||||
return getDescendantNode(li_sib, "A");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next tree node "down" from current one
|
||||
*/
|
||||
function getNextUp(node)
|
||||
{
|
||||
var a = getAnchorNode(node);
|
||||
if (!a) return null;
|
||||
|
||||
// Get previous sibling first
|
||||
var li = a.parentNode;
|
||||
var li_sib = getPrevSibling(li);
|
||||
if (li_sib != null) {
|
||||
// try to get the deepest node that preceeds this current node
|
||||
var candidate = getDescendantNode(li_sib, "A");
|
||||
var nextDown = getNextDown(candidate);
|
||||
while(nextDown != null && nextDown != node){
|
||||
candidate = nextDown;
|
||||
nextDown = getNextDown(nextDown);
|
||||
}
|
||||
return getDescendantNode(candidate, "A"); ;
|
||||
} else {
|
||||
// get the parent
|
||||
var li = li.parentNode.parentNode;
|
||||
if (li && li.tagName == "LI")
|
||||
return getDescendantNode(li, "A");
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next sibling element
|
||||
*/
|
||||
function getNextSibling(node)
|
||||
{
|
||||
var sib = node.nextSibling;
|
||||
while (sib && sib.nodeType == 3) // text node
|
||||
sib = sib.nextSibling;
|
||||
return sib;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next sibling element
|
||||
*/
|
||||
function getPrevSibling(node)
|
||||
{
|
||||
var sib = node.previousSibling;
|
||||
while (sib && sib.nodeType == 3) // text node
|
||||
sib = sib.previousSibling;
|
||||
return sib;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the child node with specified tag
|
||||
*/
|
||||
function getChildNode(parent, childTag)
|
||||
{
|
||||
var list = parent.childNodes;
|
||||
if (list == null) return null;
|
||||
for (var i=0; i<list.length; i++)
|
||||
if (list.item(i).tagName == childTag)
|
||||
return list.item(i);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the descendat node with specified tag (depth-first searches)
|
||||
*/
|
||||
function getDescendantNode(parent, childTag)
|
||||
{
|
||||
if (parent.tagName == childTag)
|
||||
return parent;
|
||||
|
||||
var list = parent.childNodes;
|
||||
if (list == null) return null;
|
||||
for (var i=0; i<list.length; i++) {
|
||||
var child = list.item(i);
|
||||
if(child.tagName == childTag)
|
||||
return child;
|
||||
|
||||
child = getDescendantNode(child, childTag);
|
||||
if (child != null)
|
||||
return child;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the anchor of this click
|
||||
* NOTE: MOZILLA BUG WITH A:focus and A:active styles
|
||||
*/
|
||||
function getAnchorNode(node) {
|
||||
|
||||
if (node.nodeType == 3) //"Node.TEXT_NODE")
|
||||
return node.parentNode;
|
||||
else if (node.tagName == "A")
|
||||
return node;
|
||||
else if (node.tagName == "IMG")
|
||||
return getChildNode(node.parentNode, "A");
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the plus/minus icon for this tree node
|
||||
*/
|
||||
function getPlusMinus(node)
|
||||
{
|
||||
if (isPlusMinus(node))
|
||||
return node;
|
||||
else if (node.nodeType == 3) //"Node.TEXT_NODE")
|
||||
return getChildNode(node.parentNode.parentNode, "IMG");
|
||||
else if (node.tagName == "IMG")
|
||||
return getChildNode(node.parentNode.parentNode, "IMG");
|
||||
else if (node.tagName == "A")
|
||||
return getChildNode(node.parentNode, "IMG");
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns true when the node is the plus or minus icon
|
||||
*/
|
||||
function isPlusMinus(node)
|
||||
{
|
||||
return (node.nodeType != 3 && node.tagName == "IMG" && (node.className == "expanded" || node.className == "collapsed"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Collapses a tree rooted at the specified element
|
||||
*/
|
||||
function collapse(node) {
|
||||
node.className = "collapsed";
|
||||
node.src = plus.src;
|
||||
node.alt = altTopicClosed;
|
||||
// set the UL as well
|
||||
var ul = getChildNode(node.parentNode, "UL");
|
||||
if (ul != null) ul.className = "collapsed";
|
||||
}
|
||||
|
||||
/**
|
||||
* Expands a tree rooted at the specified element
|
||||
*/
|
||||
function expand(node) {
|
||||
node.className = "expanded";
|
||||
node.src = minus.src;
|
||||
node.alt = altTopicOpen;
|
||||
// set the UL as well
|
||||
var ul = getChildNode(node.parentNode, "UL");
|
||||
if (ul != null){
|
||||
ul.className = "expanded";
|
||||
if (ul.id.length > 0){
|
||||
if (!frames.dynLoadFrame) {
|
||||
return;
|
||||
}
|
||||
var ix = window.location.href.indexOf('?');
|
||||
if (ix < 0) {
|
||||
return;
|
||||
}
|
||||
var query = window.location.href.substr(ix);
|
||||
frames.dynLoadFrame.location = "tocFragment.jsp" + query + "&path=" + ul.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Expands the nodes from root to the specified node
|
||||
*/
|
||||
function expandPathTo(node, inclusive)
|
||||
{
|
||||
// when the node is a link, get the plus/minus image
|
||||
if (node.tagName == "A")
|
||||
{
|
||||
var img = getChildNode(node.parentNode, "IMG")
|
||||
if (img == null) return;
|
||||
expandPathTo(img, inclusive);
|
||||
return;
|
||||
}
|
||||
|
||||
if (inclusive && isCollapsed(node))
|
||||
expand(node);
|
||||
|
||||
var li = node.parentNode;
|
||||
if (li == null) return;
|
||||
var ul = li.parentNode;
|
||||
if (ul == null) return;
|
||||
li = ul.parentNode;
|
||||
if (li == null) return;
|
||||
var img = getChildNode(li, "IMG");
|
||||
if (img == null) return;
|
||||
|
||||
expandPathTo(img, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true when this is an expanded tree node
|
||||
*/
|
||||
function isExpanded(node) {
|
||||
return node.className == "expanded";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true when this is a collapsed tree node
|
||||
*/
|
||||
function isCollapsed(node) {
|
||||
return node.className == "collapsed";
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlights link
|
||||
*/
|
||||
function highlightTopic(topic)
|
||||
{
|
||||
if (isMozilla)
|
||||
window.getSelection().removeAllRanges();
|
||||
|
||||
var a = getAnchorNode(topic);
|
||||
if (a != null)
|
||||
{
|
||||
parent.parent.parent.setContentToolbarTitle(tocTitle);
|
||||
if (oldActive)
|
||||
oldActive.className = oldActiveClass;
|
||||
|
||||
oldActive = a;
|
||||
oldActiveClass = a.className;
|
||||
a.className = "active";
|
||||
// it looks like the onclick event is not handled in mozilla
|
||||
// *** TO DO: handle failed synchronization, do not select in that case
|
||||
if (isMozilla && a.onclick)
|
||||
a.onclick()
|
||||
//if (isIE)
|
||||
// a.hideFocus = "true";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Selects a topic in the tree: expand tree and highlight it
|
||||
* returns true if success
|
||||
*/
|
||||
function selectTopic(topic)
|
||||
{
|
||||
if (!topic)
|
||||
return false;
|
||||
|
||||
// remove the query, if any
|
||||
var i = topic.indexOf('?');
|
||||
if (i != -1)
|
||||
topic = topic.substring(0, i);
|
||||
|
||||
var links = document.getElementsByTagName("a");
|
||||
|
||||
for (var i=0; i<links.length; i++)
|
||||
{
|
||||
if (topic == links[i].href)
|
||||
{
|
||||
expandPathTo(links[i], false);
|
||||
highlightTopic(links[i]);
|
||||
scrollIntoView(links[i]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Selects a topic in the tree: expand tree and highlight it
|
||||
* returns true if success
|
||||
*/
|
||||
function selectTopicById(id)
|
||||
{
|
||||
var topic = document.getElementById(id);
|
||||
if (topic)
|
||||
{
|
||||
expandPathTo(topic, false);
|
||||
highlightTopic(topic);
|
||||
scrollIntoView(topic);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrolls the page to show the specified element
|
||||
*/
|
||||
function scrollIntoView(node)
|
||||
{
|
||||
var scroll = getVerticalScroll(node);
|
||||
if (scroll != 0)
|
||||
window.scrollBy(0, scroll);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrolls the page to show the specified element
|
||||
*/
|
||||
function getVerticalScroll(node)
|
||||
{
|
||||
var nodeTop = node.offsetTop;
|
||||
var nodeBottom = nodeTop + node.offsetHeight;
|
||||
var pageTop = 0;
|
||||
var pageBottom = 0;
|
||||
|
||||
if (isIE)
|
||||
{
|
||||
pageTop = document.body.scrollTop;
|
||||
pageBottom = pageTop + document.body.clientHeight;
|
||||
|
||||
}
|
||||
else if (isMozilla)
|
||||
{
|
||||
pageTop = window.pageYOffset;
|
||||
pageBottom = pageTop + window.innerHeight - node.offsetHeight;
|
||||
}
|
||||
|
||||
var scroll = 0;
|
||||
if (nodeTop >= pageTop )
|
||||
{
|
||||
if (nodeBottom <= pageBottom)
|
||||
scroll = 0; // already in view
|
||||
else
|
||||
scroll = nodeBottom - pageBottom;
|
||||
}
|
||||
else
|
||||
{
|
||||
scroll = nodeTop - pageTop;
|
||||
}
|
||||
|
||||
return scroll;
|
||||
}
|
||||
|
||||
/*
|
||||
* Currently called on IE only
|
||||
*/
|
||||
function focusHandler(e)
|
||||
{
|
||||
if (isMozilla)
|
||||
return;
|
||||
|
||||
try{
|
||||
if (oldActive){
|
||||
// only focus when the element is visible
|
||||
var scroll = getVerticalScroll(oldActive);
|
||||
if (scroll == 0)
|
||||
oldActive.focus();
|
||||
}
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* display topic label in the status line on mouse over topic
|
||||
*/
|
||||
function mouseMoveHandler(e) {
|
||||
var overNode = getTarget(e);
|
||||
if (!overNode) return;
|
||||
|
||||
overNode = getAnchorNode(overNode);
|
||||
if (overNode == null){
|
||||
window.status = "";
|
||||
return;
|
||||
}
|
||||
|
||||
if (isMozilla)
|
||||
e.cancelBubble = false;
|
||||
|
||||
if (overNode.title == "") {
|
||||
if (overNode.innerText)
|
||||
overNode.title = overNode.innerText;
|
||||
else if (overNode.text)
|
||||
overNode.title = overNode.text;
|
||||
}
|
||||
window.status = overNode.title;
|
||||
}
|
||||
|
||||
/**
|
||||
* handler for expanding / collapsing topic tree
|
||||
*/
|
||||
function mouseClickHandler(e) {
|
||||
|
||||
var clickedNode = getTarget(e);
|
||||
|
||||
if (isPlusMinus(clickedNode) )
|
||||
{
|
||||
if (isCollapsed(clickedNode))
|
||||
expand(clickedNode);
|
||||
else if (isExpanded(clickedNode))
|
||||
collapse(clickedNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
var plus_minus = getPlusMinus(clickedNode);
|
||||
if (plus_minus != null)
|
||||
highlightTopic(plus_minus);
|
||||
}
|
||||
|
||||
if (isMozilla)
|
||||
e.cancelBubble = true;
|
||||
else if (isIE)
|
||||
window.event.cancelBubble = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* handler for expanding / collapsing topic tree
|
||||
*/
|
||||
function mouseDblClickHandler(e) {
|
||||
|
||||
var clickedNode = getTarget(e);
|
||||
if (!clickedNode) return;
|
||||
|
||||
var plus_minus = getPlusMinus(clickedNode);
|
||||
if (plus_minus != null)
|
||||
{
|
||||
if (isCollapsed(plus_minus))
|
||||
expand(plus_minus);
|
||||
else if (isExpanded(plus_minus))
|
||||
collapse(plus_minus);
|
||||
|
||||
highlightTopic(plus_minus);
|
||||
}
|
||||
|
||||
if (isMozilla)
|
||||
e.cancelBubble = true;
|
||||
else if (isIE)
|
||||
window.event.cancelBubble = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for key down (arrows)
|
||||
*/
|
||||
function keyDownHandler(e)
|
||||
{
|
||||
var key;
|
||||
|
||||
if (isIE) {
|
||||
key = window.event.keyCode;
|
||||
} else if (isMozilla) {
|
||||
key = e.keyCode;
|
||||
}
|
||||
|
||||
if (key <37 || key > 40)
|
||||
return true;
|
||||
|
||||
if (isMozilla)
|
||||
e.cancelBubble = true;
|
||||
else if (isIE)
|
||||
window.event.cancelBubble = true;
|
||||
|
||||
if (key == 39) { // Right arrow, expand
|
||||
var clickedNode = getTarget(e);
|
||||
if (!clickedNode) return;
|
||||
|
||||
var plus_minus = getPlusMinus(clickedNode);
|
||||
if (plus_minus != null)
|
||||
{
|
||||
if (isCollapsed(plus_minus))
|
||||
expand(plus_minus);
|
||||
|
||||
highlightTopic(plus_minus);
|
||||
scrollIntoView(clickedNode);
|
||||
}
|
||||
} else if (key == 37) { // Left arrow,collapse
|
||||
var clickedNode = getTarget(e);
|
||||
if (!clickedNode) return;
|
||||
|
||||
var plus_minus = getPlusMinus(clickedNode);
|
||||
if (plus_minus != null)
|
||||
{
|
||||
if (isExpanded(plus_minus))
|
||||
collapse(plus_minus);
|
||||
|
||||
highlightTopic(plus_minus);
|
||||
scrollIntoView(clickedNode);
|
||||
}
|
||||
} else if (key == 40 ) { // down arrow
|
||||
var clickedNode = getTarget(e);
|
||||
if (!clickedNode) return;
|
||||
|
||||
var next = getNextDown(clickedNode);
|
||||
if (next)
|
||||
next.focus();
|
||||
|
||||
} else if (key == 38 ) { // up arrow
|
||||
var clickedNode = getTarget(e);
|
||||
if (!clickedNode) return;
|
||||
|
||||
var next = getNextUp(clickedNode);
|
||||
if (next)
|
||||
next.focus();
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isMozilla) {
|
||||
document.addEventListener('click', mouseClickHandler, true);
|
||||
document.addEventListener('dblclick', mouseDblClickHandler, true);
|
||||
document.addEventListener('mousemove', mouseMoveHandler, true);
|
||||
document.addEventListener('keydown', keyDownHandler, true);
|
||||
}
|
||||
else if (isIE){
|
||||
document.onclick = mouseClickHandler;
|
||||
document.ondblclick = mouseDblClickHandler;
|
||||
document.onmousemove = mouseMoveHandler;
|
||||
document.onkeydown = keyDownHandler;
|
||||
window.onfocus = focusHandler;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user