// Library updated 23OCT2004 to show correct expand/collapse widget state when// invoking expandAll() and collapseAll() function.// Library updated 19JUL2004 to show correct expand/collapse widget state at// init time if the currState values have one or more expanded items by default/**********************************          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 = "oplus.gif";var collapsedWidgetStart = new Image(20, 16);collapsedWidgetStart.src = "oplusStart.gif";var collapsedWidgetEnd = new Image(20, 16);collapsedWidgetEnd.src = "oplusEnd.gif";var expandedWidget = new Image(20, 16);expandedWidget.src = "ominus.gif";var expandedWidgetStart = new Image(20, 16);expandedWidgetStart.src = "ominusStart.gif";var expandedWidgetEnd = new Image(20, 16);expandedWidgetEnd.src = "ominusEnd.gif";var nodeWidget = new Image(20, 16);nodeWidget.src = "onode.gif";var nodeWidgetEnd = new Image(20, 16);nodeWidgetEnd.src = "onodeEnd.gif";var emptySpace = new Image(20, 16);emptySpace.src = "oempty.gif";var chainSpace = new Image(20, 16);chainSpace.src = "ochain.gif";// miscellaneous globalsvar widgetWidth = "20";var widgetHeight = "16";var currState = "";var displayTarget = "contentFrame";/**********************************           DATA COLLECTIONS***********************************/var expansionState = "1,3,8,10";// constructor for outline item objectsfunction outlineItem(text, uri) {    this.text = text;    this.uri = uri;}var olData = {childNodes:             [{item:new outlineItem("Forms"),               childNodes:                   [{item:new outlineItem("Introduction", "http://www.w3.org/TR/html401/interact/forms.html#h-17.1")},                    {item:new outlineItem("Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.2"),                     childNodes:                         [{item:new outlineItem("Control Types", "http://www.w3.org/TR/html401/interact/forms.html#h-17.2.1")}                          ]},                    {item:new outlineItem("FORM Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.3")},                    {item:new outlineItem("INPUT Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.4"),                     childNodes:                         [{item:new outlineItem("INPUT Control Types", "http://www.w3.org/TR/html401/interact/forms.html#h-17.4.1")},                          {item:new outlineItem("Examples", "http://www.w3.org/TR/html401/interact/forms.html#h-17.4.2")}                          ]},                    {item:new outlineItem("BUTTON Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.5")},                    {item:new outlineItem("SELECT, OPTGROUP, OPTION Elements", "http://www.w3.org/TR/html401/interact/forms.html#h-17.6"),                     childNodes:                         [{item:new outlineItem("Pre-selected Options", "http://www.w3.org/TR/html401/interact/forms.html#h-17.6.1")}                          ]},                    {item:new outlineItem("TEXTAREA Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.7")},                    {item:new outlineItem("ISINDEX Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.8")},                    {item:new outlineItem("Labels", "http://www.w3.org/TR/html401/interact/forms.html#h-17.9"),                     childNodes:                         [{item:new outlineItem("LABEL Element", "http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1")}                          ]},                    {item:new outlineItem("FIELDSET, LEGEND Elements", "http://www.w3.org/TR/html401/interact/forms.html#h-17.10")},                    {item:new outlineItem("Element Focus", "http://www.w3.org/TR/html401/interact/forms.html#h-17.11"),                     childNodes:                         [{item:new outlineItem("Tabbing Navigation", "http://www.w3.org/TR/html401/interact/forms.html#h-17.11.1")},                          {item:new outlineItem("Access Keys", "http://www.w3.org/TR/html401/interact/forms.html#h-17.11.2")}                          ]},                    {item:new outlineItem("Disabled and Read-Only Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.12"),                     childNodes:                         [{item:new outlineItem("Disabled Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.12.1")},                          {item:new outlineItem("Read-Only Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.12.2")}                          ]},                    {item:new outlineItem("Form Submissions", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13"),                     childNodes:                         [{item:new outlineItem("Form Submission Method", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.1")},                          {item:new outlineItem("Successful Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2")},                          {item:new outlineItem("Processing Form Data", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3"),                           childNodes:                               [{item:new outlineItem("1. Identify Successful Controls", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.1")},                                {item:new outlineItem("2. Build Form Data Set", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.2")},                                {item:new outlineItem("3. Encode Form Data", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3")},                                {item:new outlineItem("4. Submit Encoded Data", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.4")}                                ]},                          {item:new outlineItem("Form Content Types", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4"),                           childNodes:                               [{item:new outlineItem("application/x-www-form-urlencoded", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1")},                                {item:new outlineItem("multipart/form-data", "http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2")}                                ]                           }                          ]                       }                    ]},              {item:new outlineItem("Scripts"),               childNodes:                   [{item:new outlineItem("Introduction", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.1")},                    {item:new outlineItem("Designing Documents for Scripts", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2"),                     childNodes:                         [{item:new outlineItem("SCRIPT Element", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.1")},                           {item:new outlineItem("Specifying the Scripting Language", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.2"),                           childNodes:                               [{item:new outlineItem("Default Language", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.2.1")},                                {item:new outlineItem("Local Language Declaration", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.2.2")},                                {item:new outlineItem("References to HTML Elements", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.2.3")}                                ]},                           {item:new outlineItem("Intrinsic Events", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.3")},                           {item:new outlineItem("Dynamic Document Modification", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.4")}                          ]},                    {item:new outlineItem("Designing for Unscriptable Clients", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.3"),                     childNodes:                         [{item:new outlineItem("NOSCRIPT Element", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.3.1")},                          {item:new outlineItem("Hiding Scripts from Clients", "http://www.w3.org/TR/html401/interact/scripts.html#h-18.3.2")}                          ]}                   ]}                  ]              };                    /**********************************  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;    // fix 23OCT2004 added code to assign correct icons when expanding all    var contentImages = document.getElementById("content").getElementsByTagName("img");    var widgetNum, expanded;    for (var i = 0; i < contentImages.length; i++) {    	if (contentImages[i].className == "collapsible") {    		widgetNum = contentImages[i].id.substring(6);	        contentImages[i].src = getExpandedWidgetState(contentImages[i].src);	    }    }    initExpand();}function collapseAll() {    var newState = "";    while (newState.length < currState.length) {        newState += "0";    }    currState = newState;    // fix 23OCT2004 added code to assign correct icons when collapsing all    var contentImages = document.getElementById("content").getElementsByTagName("img");    var widgetNum, expanded;    for (var i = 0; i < contentImages.length; i++) {    	if (contentImages[i].className == "collapsible") {    		widgetNum = contentImages[i].id.substring(6);	        contentImages[i].src = getCollapsedWidgetState(contentImages[i].src);	    }    }    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;            // fix 19JUL2004 to display expanded widget at init time if item's default is expanded            // fix 23OCT2004 added class assignments to help icons in collapse and expand all            currState += calcBlockState(currID-1);            if (currState.substr(currState.length-1) == "0") {            	output += "<img id='widget" + (currID-1) + "' class='collapsible' src='" + ((i == ol.childNodes.length-1 && blockID != 0) ? collapsedWidgetEnd.src : (blockID == 0) ? collapsedWidgetStart.src : collapsedWidget.src);            } else {            	output += "<img id='widget" + (currID-1) + "' class='collapsible' src='" + ((i == ol.childNodes.length-1 && blockID != 0) ? expandedWidgetEnd.src : (blockID == 0) ? expandedWidgetStart.src : expandedWidget.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>";            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();}