/**********************************/ Script obtained from:/ O'Reilly book 'JavaScript & DHTML Cookbook'/ by Danny Goodman/ Copyright 2003/ ISBN: 0-596-00467-2/ / This script has been modified in the following ways:/ - the filename has been changed/ - the sample data has been removed/**********************************/**********************************          GLOBAL VARIABLES***********************************/// pre-cache art files and sizes for widget styles and spacers// (all images must have same height/width)var collapsedWidget = new Image(20, 16);collapsedWidget.src = "images/oplus.gif";var collapsedWidgetStart = new Image(20, 16);collapsedWidgetStart.src = "images/oplusStart.gif";var collapsedWidgetEnd = new Image(20, 16);collapsedWidgetEnd.src = "images/oplusEnd.gif";var expandedWidget = new Image(20, 16);expandedWidget.src = "images/ominus.gif";var expandedWidgetStart = new Image(20, 16);expandedWidgetStart.src = "images/ominusStart.gif";var expandedWidgetEnd = new Image(20, 16);expandedWidgetEnd.src = "images/ominusEnd.gif";var nodeWidget = new Image(20, 16);nodeWidget.src = "images/onode.gif";var nodeWidgetEnd = new Image(20, 16);nodeWidgetEnd.src = "images/onodeEnd.gif";var emptySpace = new Image(20, 16);emptySpace.src = "images/oempty.gif";var chainSpace = new Image(20, 16);chainSpace.src = "images/ochain.gif";// miscellaneous globalsvar widgetWidth = "20";var widgetHeight = "16";var currState = "";var displayTarget = "contentFrame";/**********************************           DATA COLLECTIONS***********************************/var expansionState = "";// constructor for outline item objectsfunction outlineItem(text, uri) {    this.text = text;    this.uri = uri;}/**********************************  TOGGLE DISPLAY AND ICONS***********************************/// invert item state (expanded to/from collapsed)function swapState(currState, currVal, n) {    var newState = currState.substring(0,n);    newState += currVal ^ 1 // Bitwise XOR item n;    newState += currState.substring(n+1,currState.length);    return newState;}// retrieve matching version of 'minus' imagesfunction getExpandedWidgetState(imgURL) {    if (imgURL.indexOf("Start") != -1) {        return expandedWidgetStart.src;    }    if (imgURL.indexOf("End") != -1) {        return expandedWidgetEnd.src;    }    return expandedWidget.src;}// retrieve matching version of 'plus' imagesfunction getCollapsedWidgetState(imgURL) {    if (imgURL.indexOf("Start") != -1) {        return collapsedWidgetStart.src;    }    if (imgURL.indexOf("End") != -1) {        return collapsedWidgetEnd.src;    }    return collapsedWidget.src;}// toggle an outline mother entry, storing new state value;// invoked by onclick event handlers of widget image elementsfunction toggle(img, blockNum) {    var newString = "";    var expanded, n;    // modify state string based on parameters from IMG    expanded = currState.charAt(blockNum);    currState = swapState(currState, expanded, blockNum);    // dynamically change display style    if (expanded == "0") {        document.getElementById("OLBlock" + blockNum).style.display = "block";        img.src = getExpandedWidgetState(img.src);    } else {        document.getElementById("OLBlock" + blockNum).style.display = "none";        img.src = getCollapsedWidgetState(img.src);    }}function expandAll() {    var newState = "";    while (newState.length < currState.length) {        newState += "1";    }    currState = newState;    initExpand();}function collapseAll() {    var newState = "";    while (newState.length < currState.length) {        newState += "0";    }    currState = newState;    initExpand();}/*********************************   OUTLINE HTML GENERATION**********************************/// apply default expansion state from outline's header// info to the expanded state for one element to help // initialize currState variablefunction calcBlockState(n) {    // get default expansionState data    var expandedData = (expansionState.length > 0) ? expansionState.split(",") : null;    if (expandedData) {        for (var j = 0; j < expandedData.length; j++) {            if (n == expandedData[j] - 1) {                return "1";            }        }    }    return "0";}// counters for reflexive calls to drawOutline()var currID = 0;var blockID = 0;// generate HTML for outlinefunction drawOutline(ol, prefix) {    var output = "";    var nestCount, link, nestPrefix, lastInnerNode;    prefix = (prefix) ? prefix : "";    for (var i = 0; i < ol.childNodes.length ; i++) {        nestCount = (ol.childNodes[i].childNodes) ? ol.childNodes[i].childNodes.length : 0;        output += "<div class='OLRow' id='line" + currID++ + "'>\n";        if (nestCount > 0) {            output += prefix;            output += "<img id='widget" + (currID-1) + "' src='" + ((i == ol.childNodes.length-1 && blockID != 0) ? collapsedWidgetEnd.src : (blockID == 0) ? collapsedWidgetStart.src : collapsedWidget.src);            output += "' height=" + widgetHeight + " width=" + widgetWidth;            output += " title='Click to expand/collapse nested items.' onClick='toggle(this," + blockID + ")'>&nbsp;";            link =  (ol.childNodes[i].item.uri) ? ol.childNodes[i].item.uri : "";            if (link) {                output += "<a href='" + link + "' class='itemTitle' title='" +                 link + "' target='" + displayTarget + "'>" ;            } else {                output += "<a class='itemTitle' title='" + link + "'>";            }            output += "<span style='position:relative; top:-3px; height:11px'>" + ol.childNodes[i].item.text + "</span></a>";            currState += calcBlockState(currID-1);            output += "<span class='OLBlock' blocknum='" + blockID + "' id='OLBlock" + blockID++ + "'>";            nestPrefix = prefix;            nestPrefix += (i == ol.childNodes.length - 1) ?                        "<img src='" + emptySpace.src + "' height=" + widgetHeight + " width=" + widgetWidth + ">" :                       "<img src='" + chainSpace.src + "' height=" + widgetHeight + " width=" + widgetWidth + ">"            output += drawOutline(ol.childNodes[i], nestPrefix);            output += "</span></div>\n";        } else {            output += prefix;            output += "<img id='widget" + (currID-1) + "' src='" + ((i == ol.childNodes.length - 1) ? nodeWidgetEnd.src : nodeWidget.src);            output += "' height=" + widgetHeight + " width=" + widgetWidth + ">";            link =  (ol.childNodes[i].item.uri) ? ol.childNodes[i].item.uri : "";            if (link) {                output += "&nbsp;<a href='" + link + "' class='itemTitle' title='" +                 link + "' target='" + displayTarget + "'>";            } else {                output += "&nbsp;<a class='itemTitle' title='" + link + "'>";            }            output += "<span style='position:relative; top:-3px; height:11px'>" + ol.childNodes[i].item.text + "</span></a>";            output += "</div>\n";        }    }    return output;}/*********************************     OUTLINE INITIALIZATIONS**********************************/// expand items set in expansionState var, if anyfunction initExpand() {    for (var i = 0; i < currState.length; i++) {        if (currState.charAt(i) == 1) {            document.getElementById("OLBlock" + i).style.display = "block";        } else {            document.getElementById("OLBlock" + i).style.display = "none";        }    }}// initialize first time -- invoked onloadfunction initExpMenu(xFile) {    // wrap whole outline HTML in a span    var olHTML = "<span id='renderedOL'>" + drawOutline(olData) + "</span>";    // throw HTML into 'content' div for display    document.getElementById("content").innerHTML = olHTML;    initExpand();}