// pre-cache art files and sizes for widget styles and spacers
// (all images must have same height/width)
var firstWidget = new Image(20, 16);
firstWidget.src = "images/buttons/beginnode.gif";
var collapsedWidget = new Image(20, 16);
collapsedWidget.src = "images/buttons/oplus.gif";
var collapsedWidgetEnd = new Image(20, 16);
collapsedWidgetEnd.src = "images/buttons/oplusEnd.gif";
var expandedWidget = new Image(20, 16);
expandedWidget.src = "images/buttons/ominus.gif";
var expandedWidgetEnd = new Image(20, 16);
expandedWidgetEnd.src = "images/buttons/ominusEnd.gif";
var nodeWidget = new Image(20, 16);
nodeWidget.src = "images/buttons/onode.gif";
var XnodeWidget = new Image(20, 16);
XnodeWidget.src = "images/buttons/Xonode.gif";
var nodeWidgetEnd = new Image(20, 16);
nodeWidgetEnd.src = "images/buttons/onodeEnd.gif";
var emptySpace = new Image(20, 16);
emptySpace.src = "images/buttons/oempty.gif";
var chainSpace = new Image(20, 16);
chainSpace.src = "images/buttons/ochain.gif";

// miscellaneous globals
var widgetWidth = "20";
var widgetHeight = "16";
var currState = "", startState;

var expansionState = "4";
// constructor for outline item objects
function outlineItem(text, secCode, mcap) {
    this.text = text;
    this.secCode = secCode;
//    this.mcap = mcap;
}

// 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 || imgURL.indexOf("End") != -1)
        return expandedWidgetEnd.src;
    return expandedWidget.src;
}

// retrieve matching version of 'plus' images
function getCollapsedWidgetState(imgURL) {
    if (imgURL.indexOf("Start") != -1 || 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();
  for (var i = 0; i < currID; i++) {
    var img = document.getElementById("widget" + i);
    if (img.src == collapsedWidget.src || img.src == collapsedWidgetEnd.src)
      img.src = getExpandedWidgetState(img.src);
  }
}

function collapseAll() {
  currState = startState;
  initExpand();
  for (var i = 0; i < currID; i++) {
    var img = document.getElementById("widget" + i);
    if (img.src == expandedWidget.src || img.src == expandedWidgetEnd.src)
      img.src = getCollapsedWidgetState(img.src);
  }
}

// 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, nestPrefix;
    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) ? collapsedWidgetEnd.src : collapsedWidget.src);
            output += "' height=" + widgetHeight + " width=" + widgetWidth;
            output += " title='Click to Expand/Collapse Sub-Sectors' onClick='toggle(this," + blockID + ")'>&nbsp;";
            output += "&nbsp;<a href=\"javascript:top.treeDisp('" + ol.childNodes[i].item.secCode +
                      "')\" id=msln" + (currID-1) + " name='B" + ol.childNodes[i].item.secCode + "' title='Click to Display Sector'>";
            output += "<span style='position:relative; top:-3px; height:11px'>" + ol.childNodes[i].item.text + "</span></a>";
            currState += calcBlockState(currID-1);
            output += "<span 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;
            if (currID == 1)
              output += " <img id='widget" + (currID-1) + "' src='" + firstWidget.src;
            else if (currID <= 3)
              output += " <img id='widget" + (currID-1) + "' src='" + nodeWidget.src;
            else
              output += " <img id='widget" + (currID-1) + "' src='" + ((i == ol.childNodes.length - 1) ?
                        nodeWidgetEnd.src : XnodeWidget.src);
            output += "' height=" + widgetHeight + " width=" + widgetWidth + ">";
            output += "&nbsp;<a href=\"javascript:top.treeDisp('" + ol.childNodes[i].item.secCode +
                      "')\" id=msln" + (currID-1) + " name='X" + ol.childNodes[i].item.secCode + "' title='Click to Display Sector Chart'>";
            output += "<span style='position:relative; top:-3px; height:11px'>" + ol.childNodes[i].item.text + "</span></a>";
            output += "</div>\n";
        }
    }
    return output;
}

// 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() {
    // wrap whole outline HTML in a span
    var olHTML = "<span id='renderedOL'>" + drawOutline(self.olData) + "</span>";
    // throw HTML into 'content' div for display
    document.getElementById("content").innerHTML = olHTML;
    startState = currState;
    initExpand();
    setUpSearch()
}

var srchType = new Array(),
    srchKey = new Array();

function setUpSearch() {
  for (var i = 0; i < currID; i++) {
    var name = document.getElementById("msln" + i).name;
    srchKey[i] = name.substring(1);
    srchType[i] = name.substring(0,1);
  }
}

function newState(secCode) {
  var i, blkCnt = 0;
  for (i = 0; i < currID; i++) {
    if (srchType[i] == "B" && secCode.indexOf(srchKey[i]) == 0) {
      currState = currState.substring(0,blkCnt) + "1" + currState.substring(blkCnt+1);
      var img = document.getElementById("widget" + i);
      if (img.src == collapsedWidget.src || img.src == collapsedWidgetEnd.src)
        img.src = getExpandedWidgetState(img.src);
    }
    if (secCode == srchKey[i])
      break;
    if (srchType[i] == "B")
      blkCnt++;
  }
  initExpand();
  return srchType[i];
}

