/* -----------------------------------------------------------
 * TREE FUNCTIONS
 *
 * +/- toggle the tree, where el is the <span class="b"> node
 * force, will force it to "open" or "close"
 */

//skip actions on tree. eg. when clicked checkbox
var skipTree = false;

function setSkipTree(skipVal){
	skipTree = skipVal;
}

function checkboxToggle(el){
	var i,j;
	var el_state = el.checked;	// State of clicked checkbox
	skipTree = true;
	
	while(el != null && (!el.tagName || el.tagName.toLowerCase() != "li")) el = el.parentNode;
	ul = findChildWithTag(el, 'ul');
	parseTree(ul, el_state);
}

/*
 * Initialise a tree node, converting all its LIs appropriately
 */
function parseTree(el, el_state) {
	var i,j;
	var childUL;
	
	// Find all LIs to process
	for(i=0;i<el.childNodes.length;i++) {
		if(el.childNodes[i].tagName && el.childNodes[i].tagName.toLowerCase() == 'li') {
			var li = el.childNodes[i];
			
			if(li) {
				// li and spanA will still be set to the last item
				for(k=0;k<li.childNodes.length;k++) {
					if(li.childNodes[k].tagName && li.childNodes[k].tagName.toLowerCase() == 'span') {
						span_a = li.childNodes[k];
						for(l=0;l<span_a.childNodes.length;l++) {
							if(span_a.childNodes[l].tagName && span_a.childNodes[l].tagName.toLowerCase() == 'span') {
								span_b = span_a.childNodes[l];
								for(m=0;m<span_b.childNodes.length;m++) {
									if(span_b.childNodes[m].tagName && span_b.childNodes[m].tagName.toLowerCase() == 'span') {
										span_c = span_b.childNodes[m];
										for(n=0;n<span_c.childNodes.length;n++) {
											if(span_c.childNodes[n].tagName && span_c.childNodes[n].tagName.toLowerCase() == 'input') {
												span_c.childNodes[n].checked = el_state;
											}
											if(span_c.childNodes[n].tagName && span_c.childNodes[n].tagName.toLowerCase() == 'a') {
												span_cc = span_c.childNodes[n];
												for(p=0;p<span_cc.childNodes.length;p++) {
													if(span_cc.childNodes[p].tagName && span_cc.childNodes[p].tagName.toLowerCase() == 'input') {
														span_cc.childNodes[p].checked = el_state;
													}
												}
											}
										}
									}
								}
							}					
						}
					}
				}
			}
			
			// Find the UL within the LI, if it exists
			childUL = null;
			for(j=0;j<li.childNodes.length;j++) {
				if(li.childNodes[j].tagName && li.childNodes[j].tagName.toLowerCase() == 'ul') {
					childUL = li.childNodes[j];
					break;					
				}
			}
			
			// Process the children
			if(childUL != null) {
				parseTree(childUL, el_state);
			}
		}
	}
}

function treeToggle(el, force) {
	if(!skipTree) {
		
		while(el != null && (!el.tagName || el.tagName.toLowerCase() != "li")) el = el.parentNode;
		
		// Get UL within the LI
		var childSet = findChildWithTag(el, 'ul');
		var topSpan = findChildWithTag(el, 'span');
	
		if( force != null ){
			
			if( force == "open"){
				treeOpen( topSpan, el )
			}
			else if( force == "close" ){
				treeClose( topSpan, el )
			}
			
		}
		
		else if( childSet != null) {
			// Is open, close it
			if(!el.className.match(/(^| )closed($| )/)) {		
				treeClose( topSpan, el )
			// Is closed, open it
			} else {			
				treeOpen( topSpan, el )
			}
		}
	}
  
  skipTree = false;
}

function treeOpen( a, b ){
	removeClass(a,'spanClosed');
	removeClass(b,'closed');
}

function treeClose( a, b ){
	addClass(a,'spanClosed');
	addClass(b,'closed');
}

/*
 * Find the a child of el of type tag
 */
function findChildWithTag(el, tag) {
	for(var i=0;i<el.childNodes.length;i++) {
		if(el.childNodes[i].tagName != null && el.childNodes[i].tagName.toLowerCase() == tag) return el.childNodes[i];
	}
	return null;
}

/*
 * Functions to add and remove class names
 * Mac IE hates unnecessary spaces
 */
function addClass(el, cls, forceBefore) {
	if(forceBefore != null && el.className.match(new RegExp('(^| )' + forceBefore))) {
		el.className = el.className.replace(new RegExp("( |^)" + forceBefore), '$1' + cls + ' ' + forceBefore);

	} else if(!el.className.match(new RegExp('(^| )' + cls + '($| )'))) {
		el.className += ' ' + cls;
		el.className = el.className.replace(/(^ +)|( +$)/g, '');
	}
}

function removeClass(el, cls) {
	var old = el.className;
	var newCls = ' ' + el.className + ' ';
	newCls = newCls.replace(new RegExp(' (' + cls + ' +)+','g'), ' ');
	el.className = newCls.replace(/(^ +)|( +$)/g, '');
}


// ------------------------------------------------------------------------
// Open / Close tree node
// ------------------------------------------------------------------------
function showTreeNode(node_id,effect){
	node = document.getElementById('ul_'+node_id);
	node_img_1 = document.getElementById('ul_img_1_'+node_id);
	node_img_2 = document.getElementById('ul_img_2_'+node_id);
	if(node){
		if(node.style.display == 'none'){
			if(effect==1){
				new Effect.SlideDown(node, { duration: 0.5 });
			} else {
				node.style.display = 'block';
			}
			node_img_1.src = '/images/tree_js/ul_minus.gif';
			node_img_2.src = '/images/tree_js/page-openfoldericon.png';
		} else {
			if(effect==1){
				new Effect.SlideUp(node, { duration: 0.5 });
			} else {
				node.style.display = 'none';
			}
			node_img_1.src = '/images/tree_js/ul_plus.gif';
			node_img_2.src = '/images/tree_js/page-foldericon.png';
		}
	}
}



