function changeList(imgElement, expandedCtrlName) {
	changeNodeState(getParentTreeNode(imgElement), expandedCtrlName, false);
}

function changeNodeState(elTreeNode, hidExpandCtrlName, expandOnly) {
	if (!elTreeNode)
		return;
	
	var stateChangeTo = '0';
	
	if (elTreeNode.className == 'minus') {
		if (expandOnly)
			return;
		elTreeNode.className = 'plus';
		stateChangeTo = '0';
	} else {
		elTreeNode.className = 'minus';
		stateChangeTo = '1';
	}
	
	if (!hidExpandCtrlName)
		return;
	
	var ctrl = eval('document.forms[0].' + hidExpandCtrlName);
	
	if (!ctrl)
		return;
	
	if (ctrl.value) {
		ctrl.value = stateChangeTo;
		return;
	}
}

function getParentTreeNode(findForElement) {
	var liElement = findForElement;
	
	while (liElement.parentNode) {
		liElement = liElement.parentNode;
		if (isTreeNode(liElement))
			return liElement;
	}
	
	return null;
}

function isTreeNode(checkNode) {
	if (!checkNode)
		return false;
	if (!checkNode.getAttribute)
		return false;
	if (!checkNode.getAttribute("name"))
		return false;
	if (checkNode.getAttribute("name") != "treenode")
		return false;
	return true;
}

function changeAll(rootNode, newState) {
	var elChild = rootNode.firstChild;
	
	while (elChild) {
		if (isTreeNode(elChild))
			updateChildren(elChild, newState, false);
		elChild = elChild.nextSibling;
	}
}

function getCheckboxFieldForTreeNode(elNode) {
	var elChild = elNode.firstChild;
	while (elChild) {
		if (elChild.getAttribute && elChild.getAttribute("type") && elChild.getAttribute("type").toLowerCase() == "checkbox")
			return elChild;
		
		elChild = elChild.nextSibling;
	}
	
	elChild = elNode.firstChild;
	while (elChild) {
		var findChild = getCheckboxFieldForTreeNode(elChild);
		
		if (findChild)
			return findChild;
		
		elChild = elChild.nextSibling;
	}
	
	return null;
}

function treeCheckChange(chkElement, fUncheckParent) {
	var elLiParent = getParentTreeNode(chkElement);
	if (!elLiParent)
		return;
	
	updateChildren(elLiParent, chkElement.checked, true);
	// If unchecked then uncheck all parents
	if (!chkElement.checked && fUncheckParent)
		unCheckParent(getParentTreeNode(chkElement));
}

function unCheckParent(inElement) {
	if (!inElement.parentNode)
		return;
	
	var elParent = getParentTreeNode(inElement);
	if (!elParent)
		return;
	
	getCheckboxFieldForTreeNode(elParent).checked = false;
	unCheckParent(elParent);
}

function updateChildren(inElement, isChecked, autoExpand) {
	if (isTreeNode(inElement)) {
		var chk = getCheckboxFieldForTreeNode(inElement);
		chk.checked = isChecked;
		if (isChecked && autoExpand)
			changeNodeState(inElement, chk.id + '_expanded', true);
	}
	
	inElement = inElement.firstChild;
	while (inElement) {
		updateChildren(inElement, isChecked, autoExpand);
		inElement = inElement.nextSibling;
	}
}
