var webFXTreeConfig = 
{
	folderIcon      : '/Portal/Images/DOWNMENU.gif',
	openFolderIcon  : '/Portal/Images/UPMENU.gif',
	fileIcon        : '/Portal/Images/ico_orgdot.gif',	
	defaultText     : '',
	defaultValue    : '',
	defaultAction   : 'javascript:void(0);',
	defaultBehavior : 'classic',
	defaultTarget   : '_self'
};

// ---------- WebFXCookie class ----------
function WebFXCookie() 
{
	if ( document.cookie.length ) 
	{ 
	    this.cookies = ' ' + document.cookie; 
	}
}

WebFXCookie.prototype.setCookie = function (key, value) 
{
	// path=/ 解决 Cookie 路径问题
	document.cookie = key + '=' + escape(value) + ';path=/';
}

WebFXCookie.prototype.getCookie = function (key) 
{	                                      								      
	if ( this.cookies ) 
	{
		var start = this.cookies.indexOf(' ' + key + '=');
			
		if ( start == -1 ) 
		{ 
		    return null; 
		}

		var end = this.cookies.indexOf(";", start);
		
		if ( end == -1 ) 
		{ 
		    end = this.cookies.length; 
		}

        end -= start;
		var cookie = this.cookies.substr(start,end);

		return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1));
	}
	else 
	{ 
	    return null; 
	}
}


// ---------- webFXTreeHandler class ----------
var webFXTreeHandler = 
{
	all      : {},
	behavior : webFXTreeConfig.defaultBehavior,
	toggle   : function (oItem) 
	            { 
	                this.all[oItem.id.replace('-plus','')].toggle(); 
	            },

	cookies  : new WebFXCookie(),
	
	insertHTMLBeforeEnd	: function (oElement, sHTML)
	                      {
		                      if ( oElement.insertAdjacentHTML != null ) 
		                      {
			                      oElement.insertAdjacentHTML("BeforeEnd", sHTML)
			                      return;
		                      }
		
		                      var r = oElement.ownerDocument.createRange();
		                      r.selectNodeContents(oElement);
		                      r.collapse();
		                      
		                      var df = r.createContextualFragment(sHTML);
		                      oElement.appendChild(df);
	                      }
};


// ---------- WebFXTreeAbstractNode class ----------
// WebFXTree 和 WebFXTreeItem 属性由此派生
// sID, sText:显示信息, sValue:值, sAction:javascript行为, sTarget:目标
function WebFXTreeAbstractNode(sId, sText, sValue, sAction, sTarget)
{
	this.childNodes = [];
	this.id         = sId;
	this.value      = sValue || webFXTreeConfig.defaultValue;
	this.text       = sText || webFXTreeConfig.defaultText;
	this.action     = sAction || webFXTreeConfig.defaultAction;
	this.target     = sTarget || webFXTreeConfig.defaultTarget;
	
	webFXTreeHandler.all[this.id] = this;
}

// 添加子节点
WebFXTreeAbstractNode.prototype.add = function (node, bNoIdent) 
{
	node.parentNode = this;
	this.childNodes[this.childNodes.length] = node;
	var root = this;
	
	while ( root.parentNode ) 
	{ 
	    root = root.parentNode; 
	}
	
	if ( root.rendered ) 
	{
		webFXTreeHandler.insertHTMLBeforeEnd(document.getElementById(this.id + '-cont'), node.toString());
		
		if ( ( !this.folder ) && ( !this.openIcon ) ) 
		{
			this.icon = webFXTreeConfig.folderIcon;
			this.openIcon = webFXTreeConfig.openFolderIcon;
		}
		
		if ( !this.folder ) 
		{ 
		    this.folder = true ; this.collapse(); 
		}
	}
	
	return node;
}

// 节点折叠
WebFXTreeAbstractNode.prototype.toggle = function() 
{
	if ( this.folder ) 
	{
		if ( this.open ) 
		{ 
		    this.collapse(); 
		}
		else 
		{ 
		    this.expand(); 
		}
    }	
}

// ---------- WebFXTree class ----------
// sText:显示信息, sValue:值, sAction:javascript行为, eParent:父节点ID, sIcon:关闭图标, sOpenIcon:打开图标, sTarget:目标
function WebFXTree()
{
	this.base = WebFXTreeAbstractNode;
	this.base();
}

// WebFXTree 属性继承 WebFXTreeAbstractNode
WebFXTree.prototype = new WebFXTreeAbstractNode;

// 输出 WebFXTree
WebFXTree.prototype.toString = function() 
{	
	var str = '<div>';
	
	// 加载子节点
	var sb = [];
	
	for ( var i = 0; i < this.childNodes.length; i++ ) 
	{
		sb[i] = this.childNodes[i].toString(i, this.childNodes.length);
	}
	
	str += sb.join("") + "</div>";
	
	this.rendered = true;
	
	return str;
};

// ---------- WebFXTreeItem class ----------
// sText:显示信息, sValue:值, sAction:javascript行为, eParent:父节点ID, sIcon:关闭图标, sOpenIcon:打开图标, sTarget:目标
function WebFXTreeItem(sId, sText, sValue, sAction, sTarget) 
{
	this.base = WebFXTreeAbstractNode;
	this.base(sId, sText, sValue, sAction, sTarget);
	this.open = false; 
}

// WebFXTreeItem 属性继承 WebFXTreeAbstractNode
WebFXTreeItem.prototype = new WebFXTreeAbstractNode;

// 节点展开
WebFXTreeItem.prototype.expand = function() 
{
	if ( webFXTreeHandler.behavior == 'classic' ) 
	{
	    document.getElementById(this.id + '-icon').src = this.openIcon; 
	}

	if ( this.childNodes.length ) 
	{  
	    document.getElementById(this.id + '-cont').style.display = 'block'; 
	}

	this.open = true;	
	webFXTreeHandler.cookies.setCookie(this.id, 'F');
}

// 节点折叠
WebFXTreeItem.prototype.collapse = function() 
{
	if ( webFXTreeHandler.behavior == 'classic' ) 
	{ 
	    document.getElementById(this.id + '-icon').src = this.icon; 
	}

    if ( this.childNodes.length ) 
	{ 
	    document.getElementById(this.id + '-cont').style.display = 'none'; 
	}

	this.open = false;
	webFXTreeHandler.cookies.setCookie(this.id, '0');
}

// 输出 WebFXTreeItem
WebFXTreeItem.prototype.toString = function (nItem, nItemCount) 
{
	var foo = this.parentNode;
	var indent = '';
	
	// 获取前面空格
	while ( foo.parentNode ) 
	{
		foo = foo.parentNode;		
		indent = '&nbsp;&nbsp;&nbsp;' + indent;
	}
	
	this.folder = this.childNodes.length;
	var label = this.text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
	var str;
	
	if ( ( this.folder ) || ( webFXTreeHandler.behavior != 'classic' ) )  
	{
		if ( !this.icon ) 
		{ 
		    this.icon = webFXTreeConfig.folderIcon; 
		}
		    
		if ( !this.openIcon ) 
		{
	        this.openIcon = webFXTreeConfig.openFolderIcon; 
	    }
	    
		// alert( this.id + ':' + webFXTreeHandler.cookies.getCookie(this.id) );
		this.open = ( webFXTreeHandler.cookies.getCookie(this.id) == 'F' ) ? true : false;
		var iconSrc = ( webFXTreeHandler.behavior == 'classic' && this.open ) ? this.openIcon : this.icon;
		
		str = '<div id="' + this.id + '" onclick="webFXTreeHandler.toggle(this);" class="webfx-tree-branch">'
			+     indent 			
			+     '<img id="' + this.id + '-icon" src="' + iconSrc + '" onclick="webFXTreeHandler.toggle(this);">' 
			+     '&nbsp;'
			+     '<a href="' + this.action + '"' + (this.target ? ' target="' + this.target + '"' : '') + '>' 
			+     '<B>' + this.text + '</B>'
			+     '</a>'
			+ '</div>' 
			+ '<div id="' + this.id + '-cont" style="display:' + ( this.open ? 'block' : 'none') + ';">';
		
		// 加载子节点
		var sb = [];
		
		for ( var i = 0; i < this.childNodes.length; i++ )
		{
			sb[i] = this.childNodes[i].toString(i, this.childNodes.length);
		}
		
		str += sb.join("") + "</div>";
	}
	else // if ( !this.icon ) 
	{
	    this.icon = webFXTreeConfig.fileIcon;

	    str = '<div id="' + this.id + '" ondblclick="webFXTreeHandler.toggle(this);" class="webfx-tree-item">'
			+     indent
			+     '<img id="' + this.id + '-icon" src="' + this.icon + '">' 
			+     '&nbsp;'
			+     '<a href="' + this.action + '"' + (this.target ? ' target="' + this.target + '"' : '') + '>' 
			+     this.text
			+     '</a>'
			+ '</div>' 
	}

	return str;
}