//shorthand function to get an element by ID 
function $(id) {
	return document.getElementById(id);	
}

//get all all children from specified root node that have a specific tagname and classname
function getElementsByClassName(root, clsName,htmltag){ 
	var arr = new Array(); 
	var elems = root.getElementsByTagName(htmltag);
	var elem;
	for ( var cls, i = 0; ( elem = elems[i] ); i++ ) {
		if ( elem.className.search(clsName) != -1 ) {
			arr[arr.length] = elem;
		}
	}
	return arr;
}

//initiates treenode event handlers 
function prepareTree(treeId) {
	var tree = $(treeId);
	// get all expand/collapse links in current tree
	var branchNodes = getElementsByClassName (tree, 'branchNode', 'a'); 
	for (var i in branchNodes) {
		//assign event handler to each found element
		branchNodes[i].onclick = function () {
			//must return false to prevent link's href from firing
			return toggleBranchNode(this);
		}
	}
	//get all branch checkboxes
	var checkNodes = getElementsByClassName(tree, 'branchCheck', 'input');
	for (var i in checkNodes) {
		checkNodes[i].onclick = function() {
			return toggleBranchCheck(this);	
		}
	}
}

//called when expand/collapse (+/-) link is activated
//replaces all relevant src alt values, and shows/hides relevant childnodes
function toggleBranchNode(node) {
	//init vars
	var expand = false;
	img = node.getElementsByTagName('img')[0];	
	// expand node
	if (img.parentNode.className.search(/(^| )expand( |$)/) != -1)
		expand = true;
	//collapse node
	else
		expand = false;
	
	if (expand == true) {
		img.src = img.src.replace(/expand/, 'collapse');
		//change link's class so that next time the opposite action will occur
		img.parentNode.className = img.parentNode.className.replace(/expand/, 'collapse');
		img.alt = 'collapse folder';
	}
	else {
		img.src = img.src.replace(/collapse/, 'expand');
		img.parentNode.className = img.parentNode.className.replace(/collapse/, 'expand');
		img.alt = 'extend folder';	
	}
	
	//make changes in children of node
	var children = node.parentNode.childNodes;
	for (var i in children) {
		var child =children[i];
		if (child.nodeType == 1 && child.tagName == 'UL') {
			//show/hide child list
			child.className = expand ? '': 'collapsed';
		}
		else if (child.nodeType == 1 && child.tagName == 'IMG' && child.className.search(/branchIcon/) != -1) {
			//change open/closed icon (should use str.replace here with consistent naming scheme)
			if (expand == true) {
				child.src = 'images/open_folder.png';
				child.alt = 'opened folder';
			}
			else {
				child.src = 'images/folder.png';
				child.alt = 'closed folder';
			}
		}
	}
	return false;
}

//checks/unchecks all children checkboxes 
function toggleBranchCheck(node) {
	var checkBoxes = getElementsByClassName(node.parentNode, 'treeCheck', 'input');
	var checked = false;
	if (node.checked == true) {
		checkAll = true;
		node.title = node.title.replace(/(de)?select/, 'deselect');
	}
	else {
		checkAll = false;
		node.title = node.title.replace(/(de)?select/, 'select');
	}
		
	for (var i in checkBoxes) {
		checkBoxes[i].checked = checkAll;
		checkBoxes[i].title = checkAll ? checkBoxes[i].title.replace(/(de)?select/, 'deselect'): checkBoxes[i].title.replace(/(de)?select/, 'select');
	}
}