
/**********************************
          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";

var ip = null;

function ImagePreloader(callbackFunc){
   this.callback = callbackFunc;
   this.nLoaded = 0;
   this.nProcessed = 0;
   this.preload("oplus.gif",collapsedWidget);
   this.preload("oplusStart.gif",collapsedWidgetStart);
   this.preload("oplusEnd.gif",collapsedWidgetEnd);
   this.preload("ominus.gif",expandedWidget);
   this.preload("ominusStart.gif",expandedWidgetStart);
   this.preload("ominusEnd.gif",expandedWidgetEnd);
   this.preload("onode.gif",nodeWidget);
   this.preload("onodeEnd.gif",nodeWidgetEnd);
   this.preload("oempty.gif",emptySpace);
   this.preload("ochain.gif",chainSpace);
}
ImagePreloader.prototype.preload = function(image,oImage){
   //oImage = new Image;
   //this.aImages.push(oImage);
   oImage.onload = ImagePreloader.prototype.onload;
   oImage.onerror = ImagePreloader.prototype.onerror;
   oImage.onabort = ImagePreloader.prototype.onabort;
   oImage.oImagePreloader = this;
   oImage.bLoaded = false;
   oImage.src = image;
}

ImagePreloader.prototype.onComplete = function(){
   this.nProcessed++;
   if ( this.nProcessed == this.nImages ){
      //this.callback(this.aImages, this.nLoaded);
	  this.callback();
   }
}
ImagePreloader.prototype.onload = function(){
   this.bLoaded = true;
   this.oImagePreloader.nLoaded++;
   this.oImagePreloader.onComplete();
}
ImagePreloader.prototype.onerror = function(){
   this.bError = true;
   this.oImagePreloader.onComplete();
}
ImagePreloader.prototype.onabort = function(){
   this.bAbort = true;
   this.oImagePreloader.onComplete();
}







// miscellaneous globals
var widgetWidth = "20";
var widgetHeight = "16";
var currState = "";
var stateToStore = "";
var displayTarget = "contentFrame";
//var displayTarget = "_TOP";

/**********************************
           DATA COLLECTIONS
***********************************/
var expansionState = "";






///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////







// constructor for outline item objects
function outlineItem(text, uri, target,isboldstyle) {
    this.text = text;
    this.uri = uri;
	this.target = target;
	this.isbold = true;
}
          
          


/**********************************
  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);
	stateToStore = swapState(stateToStore, 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 = "";
	var newState2 = "";
    while (newState.length < currState.length) {
        newState += "1";
    }
    currState = newState;
	
	while (newState2.length < stateToStore.length) {
        newState2 += "1";
    }
    stateToStore = newState2;
	
    initExpand();
}

function collapseAll() {
    var newState = "";
	var newState2 = "";
	
    while (newState.length < currState.length) {
        newState += "0";
    }
    currState = newState;
	
	while (newState2.length < stateToStore.length) {
        newState2 += "0";
    }
    stateToStore = newState2;
	
    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,strtarget;
    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 : "";
			dobold = (ol.childNodes[i].item.isbold) ? true : false;
			if(ol.childNodes[i].item.target){
				strtarget = (ol.childNodes[i].item.target);
				strtarget = " target='" + strtarget + "'";
			}
			else{
				strtarget = " target='blank'";
			}
			//target = (ol.childNodes[i].item.target) ? " target='" + ol.childNodes[i].item.target : "";
			//target = (ol.childNodes[i].item.target) ? " target='" + ol.childNodes[i].item.target + "'" : "";
            if (link) {
				if(dobold){
					output += "<a href='" + link + "' class='itemTitle' title='" + link + "'>" ;
				}
				else{
                	output += "<a href='" + link + "' class='itemTitle' title='" + link + "'>" ;
				}
                //link + "' target='" + displayTarget + "'>" ;
				//output += "&nbsp;<a href='" + link + "' class='itemTitle' title='" + 
                //link + " target=\"_blank\">";
            } 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);
			stateToStore += 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(ol.childNodes[i].item.target){
				strtarget = (ol.childNodes[i].item.target);
				strtarget = " target='" + strtarget + "'";
			}
			else{
				strtarget = " target='blank'";
			}
            if (link) {
				output += "<a href='" + link + "' class='itemTitle' title='" + link + "'>" ;
                //output += "<a href='" + link + "' " + target + "' class='itemTitle' title='" + 
				//link + "' target='" + link + "'>" ;
                //link + "' target='" + displayTarget + "'>";
				//output += "&nbsp;<a href='" + link + "' class='itemTitle' title='" + 
                //link + " target=\"_blank\">";
            } 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++) {
		//document.getElementById("OLBlock" + i).style.display = "none";
       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(prevState) {
	//alert("prevState was :" + prevState);
	currState=prevState;
	//alert("Initilizing tree view.");
    // wrap whole outline HTML in a span
	//alert("Initialising");
    var olHTML = "<div id='renderedOL' style='width:400px;'>" + drawOutline(structuredTreeViewData()) + "</div>";
	//var olHTML =  drawOutline(structuredTreeViewData());
    // throw HTML into 'content' div for display
    document.getElementById("content").innerHTML = "<br>" + olHTML;
    initExpand();
}

function storeCurrState(){
	//alert("hello");
	var url = "storeTLibState.php?state=" + currState;
	//alert(url);
	postRequest(url);
}
function postRequest(strURL){
	
	//alert(strURL);
	var xmlHttp;
	if(window.XMLHttpRequest){ // For Mozilla, Safari, ...
		var xmlHttp = new XMLHttpRequest();
	}
	else if(window.ActiveXObject){ // For Internet Explorer
		var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlHttp.open('POST', strURL, true);
	xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlHttp.onreadystatechange = function(){
		if (xmlHttp.readyState == 4){
			updatepage(xmlHttp.responseText);
		}
	}
	xmlHttp.send(strURL);
}

function updatepage(str){
	//alert(str)
}
	
