function findFirstTag(parent, tagName) {
	var nextChild = parent.firstChild;
	while (nextChild) {
		if (nextChild.tagName == tagName) {
			return nextChild;
		}
		nextChild = nextChild.nextSibling;
	}
	return null;
}

function findNextSiblingTag(node, tagName) {
	var nextChild = node.nextSibling;
	while (nextChild) {
		if (nextChild.tagName == tagName) {
			return nextChild;
		}
		nextChild = nextChild.nextSibling;
	}
	return null;
}

/**
	node - li element containing name and children
*/
function initTreeNode(node) {
	//Initializing various node features

	var clickLink = findFirstTag(node,'A');
	var childContainer = findFirstTag(node,'UL');

	//if (!findNextSiblingTag(node,"LI")) {
		//AddClassName(node,"xtree-lastnode");
	//}
	if (activePath[activePath.length - 1] == node.id) {
		AddClassName(clickLink, "selected", false);
	}

	//Generate control image
	var sp = findFirstTag(node,'SPAN');
	if (childContainer && childContainer.firstChild) { //We have children
		initExpander(node,sp);
		closeTreeNode(node,sp);
	}
}

function initExpander(node,expander) {
	expander.onclick = function() {
		var childContainer = findFirstTag(node,'UL');
		if (!childContainer) {
			return;
		}
		var isOpen = (HasClassName(node,"open"));

		if (isOpen) {
			closeTreeNode(node);
		} else {
			openTreeNode(node);
		}
	};
}

function openTreeNode(node, fold) {
	if (fold == undefined) {
		fold = true;
	}
	var childContainer = findFirstTag(node,'UL');
	if (!childContainer || !childContainer.firstChild) {
		return;
	}

	initNodeChildren(node);

	if (fold) {
		closeTreeSiblings(node);
		closeTreeChildren(node);
	}

	RemoveClassName(node,"closed");
	AddClassName(node,"open", true);
}

function closeTreeNode(node) {
	var childContainer = findFirstTag(node,'UL');
	if (!childContainer || !childContainer.firstChild) {
		return;
	}

	RemoveClassName(node,"open");
	AddClassName(node,"closed", true);
}

function initNodeChildren(node) {
	if (node.getAttribute('tree:cached')) {
		return;
	}

	var childContainer = findFirstTag(node,'UL');
	if (!childContainer || !childContainer.firstChild) {
		return;
	}

	var nextChild = childContainer.firstChild;
	while (nextChild) {
		if (nextChild.tagName == 'LI') {
			initTreeNode(nextChild);
		}

		nextChild = nextChild.nextSibling;
	}

	node.setAttribute('tree:cached',true);
}

function closeTreeSiblings(node) {
	var parent = node.parentNode; //li -> ul

	var nextChild = parent.firstChild;
	while (nextChild) {
		closeTreeNode(nextChild);
		nextChild = nextChild.nextSibling;
	}
}

function closeTreeChildren(node) {
	var childContainer = findFirstTag(node,'UL');
	if (!childContainer || !childContainer.firstChild) {
		return;
	}

	closeTreeSiblings(childContainer.firstChild);
}

function openTreePath(path, fold) {
	if (fold == undefined) {
		fold = true;
	}

	for (var i=0;i<path.length;i++) {
		var node = document.getElementById('c'+path[i]);
		if (node) {
			openTreeNode(node, fold);
		}
	}
}


function initTree(treeContainerId, fold) {
	if (fold == undefined) {
		fold = true;
	}
	var container = document.getElementById(treeContainerId);
	openTreeNode(container, fold);
	container.style.display="block";
}

//CLASS NAMES


function HasClassName(objElement, strClass){
if ( objElement.className ){
  var arrList = objElement.className.split(' ');
  var strClassUpper = strClass.toUpperCase();
  for ( var i = 0; i < arrList.length; i++ ){
	 if ( arrList[i].toUpperCase() == strClassUpper ){
		return true;
		}
	 }
  }
return false;
}

function AddClassName(objElement, strClass, blnMayAlreadyExist){
if ( objElement.className ){
  var arrList = objElement.className.split(' ');
  if ( blnMayAlreadyExist ){
	 var strClassUpper = strClass.toUpperCase();
	 for ( var i = 0; i < arrList.length; i++ ){
		if ( arrList[i].toUpperCase() == strClassUpper ){
		   arrList.splice(i, 1);
		   i--;
		   }
		}
	 }
  arrList[arrList.length] = strClass;
  objElement.className = arrList.join(' ');
  }
else{
  objElement.className = strClass;
  }
}

function RemoveClassName(objElement, strClass){
if ( objElement.className ){
  var arrList = objElement.className.split(' ');
  var strClassUpper = strClass.toUpperCase();
  for ( var i = 0; i < arrList.length; i++ ){
	 if ( arrList[i].toUpperCase() == strClassUpper ){
		arrList.splice(i, 1);
		i--;
		}
	 }
  objElement.className = arrList.join(' ');
  }
}

