blob: 0637327de629b82acf8a2dee663d2caa3400f154 [file] [log] [blame]
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
// 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;
// selected node
var active;
var oldActive;
/**
* 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 row of this click
*/
function getTRNode(node) {
if (node.nodeType == 3) //"Node.TEXT_NODE")
return node.parentNode.parentNode.parentNode;
else if (node.tagName == "A")
return node.parentNode.parentNode;
else if (node.tagName == "TD")
return node.parentNode;
else if (node.tagName == "TR")
return node;
else if (node.tagName == "IMG")
return node.parentNode.parentNode.parentNode;
else
return null;
}
/**
* Returns the anchor node in this row
*/
function getAnchorNode(tr)
{
var id = tr.id.substring(1);
return document.getElementById("a"+id);
}
/**
* Return next item in the list
*/
function getNextDown(node)
{
var tr = getTRNode(node);
if (tr == null) return null;
var id = tr.id.substring(1);
var next = 1 + eval(id);
return document.getElementById("a"+next);
}
/**
* Return previous item in the list
*/
function getNextUp(node)
{
var tr = getTRNode(node);
if (tr == null) return null;
var id = tr.id.substring(1);
var next = eval(id) - 1;
if (next >= 0)
return document.getElementById("a"+next);
else
return null;
}
/**
* Highlights link. Returns true if highlights.
*/
function highlightTopic(topic)
{
if (!topic || (topic.tagName != "A" && topic.parentNode.tagName != "A"))
return false;
var tr = getTRNode(topic);
if (tr != null)
{
if (oldActive && oldActive != tr) {
oldActive.className="list";
var oldA = getAnchorNode(oldActive);
if (oldA) oldA.className = "";
}
oldActive = tr;
tr.className = "active";
var a = getAnchorNode(tr);
if (a)
{
a.className = "active";
// set toolbar title
if (a.onclick)
a.onclick();
//if (isIE)
// a.hideFocus = "true";
}
active = a;
return true;
}
return false;
}
/**
* Selects a topic in the tree: expand tree and highlight it
*/
function selectTopic(topic)
{
if (!topic || topic == "") return;
var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++)
{
// take into account the extra ?toc=.. or &toc=
if (links[i].href.indexOf(topic+"?toc=") == 0 ||
links[i].href.indexOf(topic+"&toc=") == 0 ||
links[i].href.indexOf(topic+"/?toc=") == 0)
{
highlightTopic(links[i]);
scrollIntoView(links[i]);
links[i].scrollIntoView(true);
return true;
}
}
return false;
}
/**
* Selects a topic in the list
*/
function selectTopicById(id)
{
var topic = document.getElementById(id);
if (topic)
{
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)
{
// Use the parent element for getting the offsetTop, as it appears
// that tables get their own layout measurements.
//var nodeTop = node.offsetTop;
var nodeTop = node.parentNode.offsetTop;
//var nodeBottom = nodeTop + node.offsetHeight;
var nodeBottom = nodeTop + node.parentNode.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/2;
}
else
{
scroll = nodeTop - pageTop;
}
return scroll;
}
function hidePopupMenu() {
// hide popup if open
var menu = document.getElementById("menu");
if (!menu)
return;
if (menu.style.display == "block")
menu.style.display = "none";
}
function showPopupMenu(e) {
// show the menu
var x = e.clientX;
var y = e.clientY;
e.cancelBubble = true;
var menu = document.getElementById("menu");
if (!menu)
return;
menu.style.left = x+1;
menu.style.top = y+1;
menu.style.display = "block";
}
/**
* display topic label in the status line on mouse over topic
*/
function showStatus(e) {
try {
var overNode;
if (isMozilla)
overNode = e.target;
else if (isIE)
overNode = window.event.srcElement;
else
return true;
overNode = getTRNode(overNode);
if (overNode == null) {
window.status = "";
return true;
}
if (isMozilla)
e.cancelBubble = false;
var a = getAnchorNode(overNode);
var statusText = "";
if (isIE)
statusText = a.innerText;
else if (isMozilla)
statusText = a.lastChild.nodeValue;
if (statusText != a.title)
statusText += " - " + a.title;
window.status = statusText;
} catch (e) {
}
return true;
}
function clearStatus() {
window.status="";
}
/**
* Popup a menu on right click over a bookmark.
* This handler assumes the list.js script has been loaded.
*/
function contextMenuHandler(e)
{
// hide popup if open
hidePopupMenu();
if (isIE)
e = window.event;
var clickedNode;
if (isMozilla)
clickedNode = e.target;
else if (isIE)
clickedNode = e.srcElement;
if (!clickedNode)
return true;
// call the click handler to select node
mouseClickHandler(e);
if(clickedNode.tagName == "A")
active = clickedNode;
else if (clickedNode.parentNode.tagName == "A")
active = clickedNode.parentNode;
else
return true;
showPopupMenu(e);
return false;
}
/**
* handler for clicking on a node
*/
function mouseClickHandler(e) {
// hide popup if open
var menu = document.getElementById("menu");
if (menu && menu.style.display == "block")
menu.style.display = "none";
var clickedNode;
if (isMozilla)
clickedNode = e.target;
else if (isIE)
clickedNode = window.event.srcElement;
else
return true;
highlightTopic(clickedNode);
}
function focusHandler(e)
{
if (oldActive)
oldActive.focus();
}
/**
* 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 == 40 ) { // down arrow
var clickedNode = getTarget(e);
if (!clickedNode) return;
var next = getNextDown(clickedNode);
highlightTopic(next);
if (next)
next.focus();
else
return true;
} else if (key == 38 ) { // up arrow
var clickedNode = getTarget(e);
if (!clickedNode) return;
var next = getNextUp(clickedNode);
highlightTopic(next);
if (next)
next.focus();
else
return true;
} else
return true;
return false;
}
// listen for events
if (isMozilla) {
document.addEventListener('click', mouseClickHandler, true);
document.addEventListener('keydown', keyDownHandler, true);
//document.addEventListener("focus", focusHandler, true);
}
else if (isIE){
document.onclick = mouseClickHandler;
document.onkeydown = keyDownHandler;
window.onfocus = focusHandler;
}