/**
 * Apex Framework
 * 
 * @revised $LastChangedDate: 2009-05-29 15:12:40 +0800 (Fri, 29 May 2009) $
 * @version $Id: tree-view.js 152 2009-05-29 07:12:40Z eugim $
 */

ApexTreeView = Class.create({
	
	_treeId : null,
	
	initialize : function(treeId) {
		
		this._treeId = treeId;
		var treeEl = $(this._treeId);
		if( !treeEl ){
			return;
		}
		
		//install listener
		var nodes = treeEl.getElementsByClassName('tree-node-icon');
		for(var i = 0, len = nodes.length; i < len; i++){
			nodes[i].observe('click', this._onParentNodeClick.bindAsEventListener(this));
		}
		
		//install listener for the parent "text". the above is when
		//the image is clicked, while this is when the text is clicked
		var nodesParent = treeEl.getElementsByClassName('apex-tree-parent-item');
		for(var i = 0, len = nodesParent.length; i < len; i++){
			nodesParent[i].observe('click', this._onParentNodeTextClick.bindAsEventListener(this));
		}
	},
	
	_onParentNodeTextClick : function(event){
		var el      = Event.element(event).up().previous(),
			subRoot = el.up().next();  
			
		subRoot[ subRoot.visible() ? 'hide' : 'show' ]();
		this._toggleButton(el);
	},
	
	_onParentNodeClick : function(event){
		
		var el      = Event.element(event),
			subRoot = el.up().next();  
			
		subRoot[ subRoot.visible() ? 'hide' : 'show' ]();
		this._toggleButton(el);
	},
	
	_toggleButton : function(button){
		
		if ( button.hasAttribute('src') ){
			var isExpanded = button.hasClassName('tree-node-expanded'),
				className = isExpanded ? 'tree-node-contracted' : 'tree-node-expanded';
			button.className = 'tree-node-icon ' + className;
		}
	},
	
	openNodeById : function(nodeId){
		
		var treeEl = $(this._treeId),
			node   = treeEl.select('[apex:tree-node-id=' + nodeId + ']')[0],
			sub    = node.getElementsBySelector('[class="tree-node-sub"]')[0];
			
		sub.show();
		this._toggleButton(node.firstDescendant().firstDescendant());
		
		//bubble to parent of current node
		do{
			var parentSub = sub.up().up();
			if( !parentSub.hasClassName('tree-node-sub') ){
				break;
			}
			parentSub.show();
			this._toggleButton(parentSub.previous().firstDescendant());
			sub = parentSub;
		}while(true);
	}
});
//window.loadFirebugConsole();