@doc hierarchy="GMLDOM">
	Base class for manage models dialog nodes
   (c) SAP AG 2003-2006. All rights reserved.
#INCLUDE[lib:defs.inc]
Class TNode inherit gml:Object;
property id = '';
property serverid = '';
property name = '';
property parent = ''; //the id of the parent
property parentnode = null; //the parent node
//optional properties
property hint = '';
property size = 1;
property icon = '';
property icon2 = ''; //this property relevant only for ModelNode and represents the state of the resource
property mode = '';//#[TREEVIEW_NORMAL];   //enum TREEVIEW_NORMAL, TREEVIEW_CHECKת TREEVIEW_RADIO, TREEVIEW_CASCADE
property check = false; 
property isFolder = false;
property isPublicUnit = false;
property isVirtual = false; // Node childs are cached and not contructed in toggle node
property scanned = false;
property childs = [];
property error = ''; //use getter and setter below
property gmlType = '';
property compSize = 0; //child components
constructor(id, name, hint, size, mode, check, icon, gmlType)
	this.init(id, name, hint, size, mode, check, icon, gmlType);
end
method init(id, name, hint, size, mode, check, icon, gmlType)
	this.id	  = id;   //TODO - modify this id, must be unique in tree
	this.serverid = id;  
	this.name = name;
	
	if (undefined == size) size = 1; //default is 1
	this.size = size;
	this.hint = hint || '';
	this.mode = mode || '';
	this.check = check || false;
	this.icon = icon || '';
	this.isFolder = false;
	this.isPublicUnit = false;
	
	this.scanned = false;
	this.childs = [];
	
	if (gmlType) this.gmlType = gmlType;
end
method setParent(parentnode)
	this.parent = parentnode.id;
	this.parentnode = parentnode;
	
	this.calcId();
end
method addChild(childnode)
	this.childs.push(childnode);
	childnode.setParent(this);
end
method setIcon()
end
method getHint()
	return this.hint;
end
method setHint(status, size)
	var s = size ? ("#TEXT[XFLD_MMP_SIZE]: " +  size + " " + (size==1 ? "#TEXT[XFLD_MMP_COMPONENT]" : "#TEXT[XFLD_MMP_COMPONENTS]")) : null;
	var stat = status ?  ("#TEXT[XFLD_MMP_STATUS]: " + status) : null;
	this.hint = (stat && s) ? (stat + '\n' + s) : (!s ? (!stat ? '' : stat) : s); 
end
method getDescription()
	return this.hint || '';
end
method calcId()
	var id_parts = [];
	
	var n = this;
	do {
		id_parts.unshift(n.getServerid());
		n = n.parentnode;
	} while (n)
	
	//bugfix: remove dot in the beginning
	//id_parts[0] = "dir"; 
	this.id = id_parts.join('.');
end
method getChildNodes(channel, exclude_expr, scope ,childs)
	if (this.scanned && !childs) 
		return this.childs;
	this.scanned = true;
	this.compSize = 0; // Reset size before scan
	this.setErrorMessage('');
	channel.error = '';
	var res = this.getChildren(channel, scope, childs);
	if ((!res || res.length == 0) && channel.error)
	{
		this.setErrorMessage(this.name + ": " + channel.error); 
		this.scanned = false;	
	}
	// childs are added also in other methods (i.e. buildServicesNode) 
	this.compSize += (COUNT(res) - (this.vFolders ? COUNT(this.vFolders) : 0));
	this.childs = [];
	for (var i=0, len=res.length; iCall this method to set properties of the node that reflect its state and affect its icon.
method setAttributes(attributes)
	for (var k in attributes)
		if (!(this[k] == undefined))
			this[k] = attributes[k];
	this.setIcon();
end
<@doc>Get the node's server id - can be overridden.
method getServerid()
	return this.serverid;
end
method getErrorMessage()
	return this.error;
end
method setErrorMessage(errorMessage)
	this.error = errorMessage;
end
<@doc>
Gets the node object / cached node object
cached node : {_cacheObj:boolean, parentNode:TNode, id:s}
node id
method getChild(childID, searchDeep)
	var childs = this.childs;
	if (ISEMPTY(childs) && this.sChilds) childs = this.sChilds;
	for (var i=0, len=childs.length; i