/**********************************          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 = "";// constructor for outline item objectsfunction outlineItem(text, uri) {    this.text = text;    this.uri = uri;}var olData = {childNodes:             [{item:new outlineItem("Zur Person"),               childNodes:                   [{item:new outlineItem("Geburtstage")},                    {item:new outlineItem("Leben")},                    {item:new outlineItem("Ort", "Probe.html")}                    ]},	      {item:new outlineItem("Zu Projekten"),               childNodes:                   [{item:new outlineItem("Kata", "Projekte/Kata_Diplom/Kata_Diplom.html")},                    {item:new outlineItem("Olli-Nissen", "Projekte/OlliMolli/renderings.html")},                    {item:new outlineItem("Pr&uuml;fungen"),					 childNodes:					     [{item:new outlineItem("Stadtplanung")},					      {item:new outlineItem("Geb&auml;udekunde", "Projekte/Pruefung/Gebaeudekunde/RahmenGliederung.html")}					     ]},		    {item:new outlineItem("Pfefferberg", "http://www.viellieb.org/Version2_0/Projekte/Pfefferberg/Pfefferbergstart.html"),			    childNodes:			    	[{item:new outlineItem("Inhalt", "Projekte/Pfefferberg/Inhalt.html")},				 {item:new outlineItem("These", "Projekte/Pfefferberg/these/denkmal.html")},				 {item:new outlineItem("Geschichte"),					 childNodes:					     [{item:new outlineItem("1841-1886")},					      {item:new outlineItem("1887-1920")},					      {item:new outlineItem("1921-1989")},					      {item:new outlineItem("1990-2002")}					     ]},				 {item:new outlineItem("Ist-Soll"),					 childNodes:					     [{item:new outlineItem("Ver. Pfefferwerk")},					      {item:new outlineItem("Akira Ikeda Gallery")},					      {item:new outlineItem("Entwurf")},					      {item:new outlineItem("Denkmalpflege")}					     ]},				 {item:new outlineItem("Bewertung"),					 childNodes:					     [{item:new outlineItem("Vergleichsbauten")},					      {item:new outlineItem("Die Bauwerke"),						      	childNodes:							    [{item:new outlineItem("Flaschenkeller")},							     {item:new outlineItem("Kesselhaus")},							     {item:new outlineItem("Biergarten")},							     {item:new outlineItem("Kellergew&ouml;lbe")}					      		    ]}					     ]},				 {item:new outlineItem("Befund")}				]},                    {item:new outlineItem("Olli-Nissen", "Projekte/OlliMolli/renderings.html")},                    {item:new outlineItem("WAS_SAGEN!?", "Projekte/wassagen/Anfang.html")}                    ]},	              {item:new outlineItem("Zu Pfaden"),               childNodes:                   [{item:new outlineItem("MacOSX", "Pfade/macosx.html")},                    {item:new outlineItem("Netzst&auml;ttenhelfer", "Pfade/helfer.html")},                    {item:new outlineItem("Informationen", "Pfade/informationen.html")},                    {item:new outlineItem("Leben", "Pfade/leben.html")},                    {item:new outlineItem("Geschichte", "Pfade/geschichte.html")},                    {item:new outlineItem("Musik", "Pfade/musik.html")},                    {item:new outlineItem("Grafik/Design", "Pfade/grafik.html")},                    {item:new outlineItem("Konsum", "Pfade/konsum.html")},                    {item:new outlineItem("Rezepte", "Pfade/rezepte.html")},                    {item:new outlineItem("Freunde", "Pfade/freunde.html")},                    {item:new outlineItem("Danke", "Pfade/danke.html")}                   ]}              ]};                    /**********************************  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='Drüberfahren zum öffnen und schließen der Struktur.' onmouseover='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();}
