var nowData;
var showingTree = false;
var nowViewing = "";

function doOnLoad () {
	loadData();
	nowData = data;
	goNext1();
}


function goHome () {
	setNowViewing("");
	goNext1();
}

function goPrevious1 () {
	var ppos = getPreviousPosition ();
	if (ppos.length > 0) {
		show1 (ppos);
		return true;
	}
	return false;
}

function goNext1 () {
	var npos = getNextPosition ();
	if (npos.length > 0) {
		show1 (npos);
		return true;
	}
	return false;
}

function goPrevious () {
	var ppos = getPreviousPosition ();
	if (ppos.length > 0) {
		show (ppos);
		return true;
	}
	return false;
}

function goNext () {
	var npos = getNextPosition ();
	if (npos.length > 0) {
		show (npos);
		return true;
	}
	return false;
}

function getPreviousPosition () {
	
	var posArray = getArrayFromString(getNowViewing(),",");
	var node = getNode(posArray);
	
	var loopCount = 0;
	var found = false;

outerwhile:	
	while (loopCount < 10000) {
		loopCount++;
		// If at root, can't go back, exit looping
		if (posArray.length == 0) {
			break;
		}
			
		// If first child, visit parent 
		// (parent must be there, because not at root)
		var thisChildIndex = parseInt(posArray[posArray.length - 1],10);
		if (thisChildIndex == 0) {
			posArray = shrinkArray(posArray);
			node = getNode(posArray);
			if (node.file.length > 0) {
				found = true;
				break outerwhile;
			} else {
				continue outerwhile;
			}
		}
				
		// Move to previous brother
		var movePosArray = getArrayFromString(getStringFromArray(posArray,","),",");
		movePosArray[movePosArray.length - 1] = thisChildIndex - 1;
		
		var moveNode;
innerwhile:
		while (loopCount < 10000) {
			loopCount++;
			
			moveNode = getNode(movePosArray);
			if (moveNode.length == 0) {
				posArray = movePosArray;
				node = getNode(posArray);
				if (node.file.length > 0) {
					found = true;
					break outerwhile;
				} else {
					continue outerwhile;
				}
			}
			
			movePosArray = stretchArray (movePosArray);
			movePosArray[movePosArray.length - 1] = moveNode.length - 1;
			continue innerwhile;
		}
	}
	
	if (found) {
		s = getStringFromArray(posArray,",");
		return s;
	} else {
		return "";
	}
}

function getNextPosition () {
	
	var posArray = getArrayFromString(getNowViewing(),",");
	var node = getNode(posArray);
	
	var loopCount = 0;
	var found = false;
	var visitNotMove = true;
	while (loopCount < 10000) {
		loopCount++;
		
		// If visiting, Visit the first child
		if ((node.length > 0) && (visitNotMove)) {
			visitNotMove = true;
			posArray = stretchArray (posArray);
			node = getNode(posArray);
			if (node.file.length > 0) {
				found = true;
				break;
			}
			continue;
		}
		
		// Break for singularity
		if ((node.length == 0) && (posArray.length == 0)) {
			break;
		}
		
		// Visit the next brother
		visitNotMove = true;
		var thisChildIndex = parseInt(posArray[posArray.length - 1],10);
		var parentNode = getParentNode (posArray);
		if ((thisChildIndex + 1) < parentNode.length) {
			posArray[posArray.length - 1] = thisChildIndex + 1;
			node = getNode(posArray);
			if (node.file.length > 0) {
				found = true;
				break;
			}
			continue;
		}
		
		// Move up to the parent
		visitNotMove = false;
		posArray = shrinkArray (posArray);
		node = getNode (posArray);
		continue;
	}
	
	if (found) {
		var s = getStringFromArray(posArray,",");
		return s;
	} else { 
		return ""; 
	}
}

function getArrayFromString (theString,separator) {
	var a = new Array(0);
	if (theString.length == 0) {
		return a;
	}
	if (theString.indexOf(separator) < 0) {
		a[0] = theString;
		return a;
	}
	return theString.split(separator);
}

function getStringFromArray (theArray,separator) {
	var s = "";
	for ( var i = 0; i < theArray.length; i++ ) {
		if (i != 0) {
			s += separator;
		}
		s += theArray[i];
	}
	return s;
}

function shrinkArray (theArray) {
	if (theArray.length == 0) {
		return theArray;
	}
	var newArray = new Array (theArray.length - 1);
	for (var i = 0; i < newArray.length; i++ ) {
		newArray[i] = theArray[i];
	}
	return newArray;
}

function stretchArray (theArray) {
	var newArray = new Array (theArray.length + 1);
	for (var i = 0; i < theArray.length; i++ ) {
		newArray[i] = theArray[i];
	}
	newArray[newArray.length - 1] = 0;
	return newArray;
}

function getParentNode (posArray) {
	var node = nowData;
	for ( var i = 0; i < (posArray.length - 1); i++ ) {
		node = node[posArray[i]];
	}
	return node;
}

function getNode (posArray) {
	var node = nowData;
	for ( var i = 0; i < posArray.length; i++ ) {
		node = node[posArray[i]];
	}
	return node;
}

function showTOC () {
	expandTreeForViewing (getNowViewing());
	refreshTree (nowData);
}

function show1 (pos) {
	var posArray = getArrayFromString(pos,",");
	var req = nowData;
	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
	}
	if (req.file.length == 0) {
		expandOrCollapse (pos);
		return;
	}
	parent.frames["main"].location.replace(req.file);
	setNowViewing(pos);
	showingTree = false;
}

function show (pos) {
	var posArray = getArrayFromString(pos,",");
	var req = nowData;
	var x;
	var y;
	var win;

	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
	}
	
	if (req.file.length == 0) {
		expandOrCollapse (pos);
		return;
	} 
	
	else {

			
		//alert(req.file);
	
		x=((screen.width/2)-397);
		y=((screen.height/2)-273);

		if (screen.width <= 800) 
			x = 0 ;

		if (screen.height <= 600) 
			y = 0;

		win=window.open(req.file,"index","height=546,width=794,scrollbars=no,location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=no");
		win.moveTo(x,y);
		win.focus();
	
	}


	setNowViewing(pos);
	

}

function setNowViewing (newPos) {
	var posArray = getArrayFromString(getNowViewing(),",");
	var req = nowData;
	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
	}
	req.isShowing = false;
	
	posArray = getArrayFromString(newPos,",");
	req = nowData;
	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
	}
	req.isShowing = true;
	nowViewing = newPos;
}

function getNowViewing () {
	return nowViewing;
}

function expandTreeForViewing (pos) {
	var posArray = getArrayFromString(pos,",");
	var req = nowData;
	if ((req.length > 0) && (!(req.isExpanded))) {
		req.isExpanded = true;
	}
	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
		if ((req.length > 0) && (!(req.isExpanded))) {
			req.isExpanded = true;
		}
	}
}

function expandOrCollapse (pos) {
	var posArray = getArrayFromString(pos,",");
	var req = nowData;
	for ( var i = 0; i < posArray.length; i++ ) {
		req = req[(posArray[i])];
	}
	if (req.length > 0) {
		if (req.isExpanded) { req.isExpanded = false; }
		else { req.isExpanded = true; }
	}
	refreshTree(nowData);
}


function refreshTree (treeData) {
	writeContent (composeTreeFull (treeData),parent.frames["main"]);
	showingTree = true;
}

