text: /*
  	Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  	Available via Academic Free License >= 2.1 OR the modified BSD license.
  	see: http://dojotoolkit.org/license for details
  */
  
  
  if(!dojo._hasResource["dojox.wire.TreeAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  dojo._hasResource["dojox.wire.TreeAdapter"] = true;
  dojo.provide("dojox.wire.TreeAdapter");
  
  dojo.require("dojox.wire.CompositeWire");
  
  dojo.declare("dojox.wire.TreeAdapter", dojox.wire.CompositeWire, {
  	//	summary:
  	//		A composite Wire for tree nodes
  	//	description:
  	//		This class has multiple child Wires for tree nodes, their title and
  	//		child nodes.
  	//		The root object for this class must be an array.
  	//		'node' Wires in 'nodes' property is used to identify an object
  	//		representing a node.
  	//		'title' Wires in 'nodes' property is used to get the title string
  	//		of a node.
  	//		'children' Wires in 'nodes' property is used to iterate over child
  	//		node objects.
  	//		The node values are returned in an array as follows:
  	//			[
  	//				{title: title1,
  	//		  	 	children: [
  	//					{title: title2,
  	//					 child: ...},
  	//					{title: title3,
  	//					 child: ...},
  	//					...
  	//				]},
  	//				...
  	//			]
  	//		This class only supports getValue(), but not setValue().
  	
  	_wireClass: "dojox.wire.TreeAdapter",
  	
  	constructor: function(/*Object*/args){
  		//	summary:
  		//		Initialize properties
  		//	description:
  		//		If object properties ('node', 'title' and 'children') of array
  		//		elements specified in 'nodes' property are not Wires, Wires are
  		//		created from them as arguments, with 'parent' property set to
  		//		this Wire instance.
  		//	args:
  		//		Arguments to initialize properties
  		//		nodes:
  		//			An array containing objects for child Wires for node values
  		this._initializeChildren(this.nodes);
  	},
  	_getValue: function(/*Array*/object){
  		//	summary:
  		//		Return an array of tree node values
  		//	description:
  		//		This method iterates over an array specified to 'object'
  		//		argument and calls getValue() method of 'node' Wires with each
  		//		element of the array to get object(s) that represetns nodes.
  		//		(If 'node' Wires are omitted, the array element is used for
  		//		further processing.)
  		//		Then, getValue() method of 'title' Wires are called to get
  		//		title strings for nodes.
  		//		(If 'title' Wires are omitted, the objects representing nodes
  		//		are used as title strings.)
  		//		And if an array of objects with 'node' and 'title' Wires is
  		//		specified to 'children', it is used to gather child nodes and
  		//		their title strings in the same way recursively.
  		//		Finally, an array of the top-level node objects are retuned.
  		//	object:
  		//		A root array
  		//	returns:
  		//		An array of tree node values
  		if(!object || !this.nodes){
  			return object; //Array
  		}
  
  		var array = object;
  		if(!dojo.isArray(array)){
  			array = [array];
  		}
  
  		var nodes = [];
  		for(var i in array){
  			for(var i2 in this.nodes){
  				nodes = nodes.concat(this._getNodes(array[i], this.nodes[i2]));
  			}
  		}
  		return nodes; //Array
  	},
  
  	_setValue: function(/*Array*/object, /*Array*/value){
  		//	summary:
  		//		Not supported
  		throw new Error("Unsupported API: " + this._wireClass + "._setValue");
  	},
  
  	_initializeChildren: function(/*Array*/children){
  		//	summary:
  		//		Initialize child Wires
  		//	description:
  		//		If 'node' or 'title' properties of array elements specified in
  		//		'children' argument are not Wires, Wires are created from them
  		//		as arguments, with 'parent' property set to this Wire instance.
  		//		If an array element has 'children' property, this method is
  		//		called recursively with it.
  		//	children:
  		//		An array of objects containing child Wires
  		if(!children){
  			return; //undefined
  		}
  
  		for(var i in children){
  			var child = children[i];
  			if(child.node){
  				child.node.parent = this;
  				if(!dojox.wire.isWire(child.node)){
  					child.node = dojox.wire.create(child.node);
  				}
  			}
  			if(child.title){
  				child.title.parent = this;
  				if(!dojox.wire.isWire(child.title)){
  					child.title = dojox.wire.create(child.title);
  				}
  			}
  			if(child.children){
  				this._initializeChildren(child.children);
  			}
  		}
  	},
  
  	_getNodes: function(/*Object*/object, /*Object*/child){
  		//	summary:
  		//		Return an array of tree node values
  		//	description:
  		//		This method calls getValue() method of 'node' Wires with
  		//		'object' argument to get object(s) that represents nodes.
  		//		(If 'node' Wires are omitted, 'object' is used for further
  		//		processing.)
  		//		Then, getValue() method of 'title' Wires are called to get
  		//		title strings for nodes.
  		//		(If 'title' Wires are omitted, the objects representing nodes
  		//		are used as title strings.)
  		//		And if an array of objects with 'node' and 'title' Wires is
  		//		specified to 'children', it is used to gather child nodes and
  		//		their title strings in the same way recursively.
  		//		Finally, an array of node objects are returned.
  		//	object:
  		//		An object
  		//	child:
  		//		An object with child Wires
  		//	returns:
  		var array = null;
  		if(child.node){
  			array = child.node.getValue(object);
  			if(!array){
  				return [];
  			}
  			if(!dojo.isArray(array)){
  				array = [array];
  			}
  		}else{
  			array = [object];
  		}
  
  		var nodes = [];
  		for(var i in array){
  			object = array[i];
  			var node = {};
  			if(child.title){
  				node.title = child.title.getValue(object);
  			}else{
  				node.title = object;
  			}
  			if(child.children){
  				var children = [];
  				for(var i2 in child.children){
  					children = children.concat(this._getNodes(object, child.children[i2]));
  				}
  				if(children.length > 0){
  					node.children = children;
  				}
  			}
  			nodes.push(node);
  		}
  		return nodes; //Array
  	}
  });
  
  }
  