var RadTreeView_KeyboardHooked = false; 
var RadTreeView_Active = null;
var RadTreeView_DragActive = null;
var RadTreeView_MouseMoveHooked = false;
var RadTreeView_MouseUpHooked = false;
var RadTreeView_MouseY = 0;
var RadTreeViewGlobalFirstParam = null;
var RadTreeViewGlobalSecondParam = null;
var RadTreeViewGlobalThirdParam = null;	
var RadTreeViewGlobalFourthParam = null;
var contextMenuToBeHidden = null;
var safariKeyDownFlag = true;

if (typeof(window.RadControlsNamespace) == "undefined")
{
	window.RadControlsNamespace = new Object();
};

RadControlsNamespace.AppendStyleSheet = function(callback, clientID, pathToCssFile)
{
	if (!pathToCssFile) 
	{ 
		return; 
	}

	if (!callback)
	{
		document.write("<" + "link" + " rel='stylesheet' type='text/css' href='" + pathToCssFile + "' />");
	}
	
	else
	{
		var linkObject = document.createElement("LINK");
		linkObject.rel = "stylesheet";
		linkObject.type = "text/css";
		linkObject.href = pathToCssFile;
		document.getElementById(clientID + "StyleSheetHolder").appendChild(linkObject);
	}
};

function RadTreeNode()
{	
	this.Parent = null;
	this.TreeView = null;
	this.Nodes = new Array();	
	this.ID = null;
	this.ClientID = null;
	this.SignImage = null;
	this.SignImageExpanded = null;
	this.Image = 0;
	this.ImageExpanded = 0;
	this.Action = null;
	this.Index = 0;
	this.Level = 0;
	
	this.Text = null; 
	this.Value = null;
	this.Category = null;
	
	this.NodeCss = null;
	this.NodeCssOver = null;
	this.NodeCssSelect = null;
	
	this.ContextMenuName = null;
	
	this.Enabled = true;
	this.Expanded = false;
	this.Checked = false;
	this.Selected = false;
	this.DragEnabled = 1;
	this.DropEnabled = 1;
	this.EditEnabled = 1;
	this.ExpandOnServer = 0;
	this.IsClientNode = 0;
	
	this.Attributes = new Array();
	this.IsFetchingData = false;
	this.CachedText = "";
};

RadTreeNode.prototype.ScrollIntoView = function()
{
    var nodeElement = this.TextElement();
    var treeViewElement = document.getElementById(this.TreeView.Container);    
    treeViewElement.scrollTop = nodeElement.offsetTop;
};

RadTreeNode.prototype.Next = function()
{
	var nodeCollection = (this.Parent != null) ? this.Parent.Nodes : this.TreeView.Nodes;	
	return (this.Index >= nodeCollection.length) ? null : nodeCollection[this.Index + 1];	
};

RadTreeNode.prototype.Prev = function()
{
	var nodeCollection = (this.Parent != null) ? this.Parent.Nodes : this.TreeView.Nodes;
	return (this.Index <= 0) ? null : nodeCollection[this.Index - 1];
};

RadTreeNode.prototype.NextVisible = function()
{
	if (this.Expanded && this.Nodes.length > 0)
	{
		return this.Nodes[0];
	}
	if (this.Next() != null)
	{
		return this.Next();	
	}
	
	var currentNode = this;
	while (currentNode.Parent != null)
	{
		if (currentNode.Parent.Next() != null)
			return currentNode.Parent.Next();
		currentNode = currentNode.Parent;
	}
	
	return null;
};

RadTreeNode.prototype.LastVisibleChild = function(node)
{
    var nodeCollection = node.Nodes;
    var nodesCount = nodeCollection.length;
    var lastNode = nodeCollection[nodesCount - 1];
    var resultNode = lastNode;
    
    if (lastNode.Expanded && lastNode.Nodes.length > 0)
    {
        resultNode = this.LastVisibleChild(lastNode);
    }
    
    return resultNode;
}

RadTreeNode.prototype.PrevVisible = function()
{	
	var prevSibling = this.Prev();
	
	if (prevSibling != null)
	{
		if (prevSibling.Expanded && prevSibling.Nodes.length > 0)
		{
		    return this.LastVisibleChild(prevSibling);
		}
		
		return this.Prev();
	}
	if (this.Parent != null)
	{
		return this.Parent;
	}
	
	return null;
};

RadTreeNode.prototype.Toggle = function()
{
	if (this.Enabled)
	{	
		if (this.TreeView.FireEvent(this.TreeView.BeforeClientToggle, this) == false)
		{
			return;
		}
		(this.Expanded) ? this.Collapse() : this.Expand();
		
		if (this.ExpandOnServer != 2) //Don't fire twice in server-side callback mode
		{
		    this.TreeView.FireEvent(this.TreeView.AfterClientToggle, this);
		}
	}
};

RadTreeNode.prototype.CollapseNonParentNodes = function()
{
    for (var i=0;i<this.TreeView.AllNodes.length;i++)
	{
	   if (this.TreeView.AllNodes[i].Expanded && !this.IsParent(this.TreeView.AllNodes[i]))
	   {
			this.TreeView.AllNodes[i].CollapseNoEffect();
	   }
	} 
};

RadTreeNode.prototype.EncodeURI = function(s)
{
	try
	{
		return encodeURIComponent(s);
	}
	catch (e)
	{
		return escape(s);	
	}	
};

//DESHEV: throwing if the treeview has not been created on the server
RadTreeNode.prototype.RaiseNoTreeViewOnServer = function()
{
	throw new Error("No RadTreeView instance has been created on the server.\n"+
	"Make sure that you have the control instance created.\n"+
	"Please review this article for additional information.");
}

RadTreeNode.prototype.FetchDataOnDemand = function()
{	
	if (this.Checked == 1)
	{
	    this.Checked = true;
	}
	var url = this.TreeView.LoadOnDemandUrl + "&rtnClientID=" + this.ClientID + "&rtnLevel=" + this.Level + "&rtnID=" + this.ID + "&rtnParentPosition=" + this.GetParentPositions() + "&rtnText=" + this.EncodeURI(this.Text) + "&rtnValue=" + this.EncodeURI(this.Value) + "&rtnCategory=" + this.EncodeURI(this.Category) + "&rtnChecked=" + this.Checked;
	
	var xmlRequest;	
	if (typeof(XMLHttpRequest) != "undefined")
	{
		xmlRequest = new XMLHttpRequest();		
	}
	else
	{		
		xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");		
	}
	
	url = url + "&timeStamp=" + encodeURIComponent((new Date()).getTime());
	xmlRequest.open("GET", url, true);
	xmlRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8")
	
	var nodeInstance = this;
	xmlRequest.onreadystatechange=function() 
	{
		if (xmlRequest.readyState != 4) return;		
		
		var html = xmlRequest.responseText;					
		
		if (xmlRequest.status == 500)
	    {
    		alert("RadTreeView: Server error in the NodeExpand event handler, press ok to view the result.");
		    document.body.innerHTML = html;
		    return;
	    }	
		 
		var index = html.indexOf(",");		
        //DESHEV: trying to find out if the treeview has not been created on the server
        //		if (index < 0)
        //			nodeInstance.RaiseNoTreeViewOnServer();

		var arrayLength = parseInt(html.substring(0,index));
        //DESHEV: trying to find out if the treeview has not been created on the server
        //		if (isNaN(arrayLength))
        //			nodeInstance.RaiseNoTreeViewOnServer();

		var clientArray = html.substring(index+1, arrayLength + index+1);
		var htmlDataArray = html.substring(arrayLength + index+1);
		nodeInstance.LoadNodesOnDemand(clientArray, xmlRequest.status, url);
		
		nodeInstance.ImageOn();
		nodeInstance.SignOn();
		nodeInstance.Expanded = true;
		nodeInstance.ExpandOnServer = 0;	
		
		var theElement = nodeInstance.TextElement().parentNode;
		var sourceElement = theElement.parentNode;		
		
		
		switch (nodeInstance.TreeView.LoadingMessagePosition)
		{
			case 0 :
			case 1 : 				 
					if (theElement.tagName == "A")
					{										
						theElement.firstChild.innerHTML = nodeInstance.CachedText;					
					}					
					else
					{
						sourceElement = nodeInstance.TextElement().parentNode;					
						if (nodeInstance.TextElement().innerText)
						{
							nodeInstance.TextElement().innerHTML = nodeInstance.CachedText;
							//nodeInstance.TextElement().innerText = nodeInstance.CachedText;
						}
						else
						{
							nodeInstance.TextElement().innerHTML = nodeInstance.CachedText;
						}	
					}
					break;
			case 2 : 					
					theElement.removeChild(document.getElementById(nodeInstance.ClientID + "Loading"));
					sourceElement = nodeInstance.TextElement().parentNode;
					break;
			case 3 :
					sourceElement = nodeInstance.TextElement().parentNode;
		}		
		
		if (nodeInstance.Nodes.length > 0)
		{
			rtvInsertHTML(sourceElement,htmlDataArray);						
			var images = sourceElement.getElementsByTagName("IMG");
			for (var i=0; i<images.length; i++)
			{				
				RadTreeView.AlignImage(images[i]);
			}
			
			var chkBoxes = sourceElement.getElementsByTagName("INPUT");
			for (var i=0; i<chkBoxes.length; i++)
			{				
				RadTreeView.AlignImage(chkBoxes[i]);
			}
		}		
		
		nodeInstance.IsFetchingData = false;
		nodeInstance.TreeView.FireEvent(nodeInstance.TreeView.AfterClientToggle, nodeInstance);	
	};
	
	xmlRequest.send(null);	
};

RadTreeNode.prototype.Expand = function()
{
	if (this.ExpandOnServer)
	{		
		if (!this.TreeView.FireEvent(this.TreeView.BeforeClientToggle, this))
		{
			return;
		}
		
		if (this.ExpandOnServer == 1)
		{			
		    this.TreeView.PostBack("NodeExpand", this.ClientID);
			return;
		}
		if (this.ExpandOnServer == 2)
		{			
			if (!this.IsFetchingData)
			{
				this.IsFetchingData = true;
				this.CachedText = this.TextElement().innerHTML;
				
				switch (this.TreeView.LoadingMessagePosition)
				{
					case 0 : this.TextElement().innerHTML = "<span class=" + this.TreeView.LoadingMessageCssClass + ">" + this.TreeView.LoadingMessage +  "</span> " + this.TextElement().innerHTML;
							break;
					case 1 : this.TextElement().innerHTML = this.TextElement().innerHTML + " " + "<span class=" + this.TreeView.LoadingMessageCssClass + ">" +this.TreeView.LoadingMessage +  "</span> ";				
							break;				
					case 2 : rtvInsertHTML(this.TextElement().parentNode,"<div id=" + this.ClientID + "Loading " +  " class=" + this.TreeView.LoadingMessageCssClass + ">"+ this.TreeView.LoadingMessage+ "</div>");
							break;
				}
				
				var nodeInstance = this;
				window.setTimeout( function() { nodeInstance.FetchDataOnDemand() }, 20);			
				return;
			}
		}
	}
	
    if (!this.Nodes.length) 
    {
		return;
	}
    if (this.TreeView.SingleExpandPath)
    {
		this.CollapseNonParentNodes();
	}
	
    var childGroup = document.getElementById("G" + this.ClientID);
   
	if (this.TreeView.ExpandDelay > 0)
	{
		childGroup.style.overflow = "hidden";
		childGroup.style.height = "1px";  
		childGroup.style.display = "block";
		childGroup.firstChild.style.position = "relative";
    
		window.setTimeout( "rtvNodeExpand(1,'" + childGroup.id + "'," + this.TreeView.ExpandDelay + ");", 20);
	}
	else
	{
		childGroup.style.display = "block";
	}
    
	this.ImageOn();
	this.SignOn();
	this.Expanded = true;
	if (!this.IsClientNode)
	{
		this.TreeView.UpdateExpandedState();
	}
};

RadTreeNode.prototype.GetParentPositions = function()
{
	var parentNode = this;
	var result = "";
	while (parentNode != null)
	{
		if (parentNode.Next() != null)
		{
			result = result + "1";
		}
		else
		{
			result = result + "0";
		}
			
		parentNode = parentNode.Parent;
	}
	
	return result;	
};

RadTreeNode.prototype.Collapse = function()
{	
	if (this.Nodes.length > 0)
	{
		if (!this.TreeView.FireEvent(this.TreeView.BeforeClientToggle, this))
		{
			return;
		}
		
		if (this.ExpandOnServer == 1 && this.TreeView.NodeCollapseWired)
		{			
		    this.TreeView.PostBack("NodeCollapse", this.ClientID);
			return;
		}
				
		if (this.TreeView.ExpandDelay > 0)
		{			
			var childGroup = document.getElementById("G" + this.ClientID); 
			
			if (childGroup.scrollHeight != "undefined")
			{
				childGroup.style.overflow = "hidden";
				childGroup.style.display = "block";
				childGroup.firstChild.style.position = "relative";			

				window.setTimeout("rtvNodeCollapse(" + childGroup.scrollHeight + ",'" + childGroup.id + "'," + this.TreeView.ExpandDelay + " );", 20);
			}
			else
			{
				this.CollapseNoEffect();
			}			
		}
		else
		{
			this.CollapseNoEffect();
		}
		
		this.ImageOff();
		this.SignOff();
		this.Expanded = false;
		this.TreeView.UpdateExpandedState();
	}
};

RadTreeNode.prototype.CollapseNoEffect = function()
{	
	if (this.Nodes.length > 0)
	{
		var childGroup = document.getElementById("G" + this.ClientID); 		
		childGroup.style.display = "none";
		
		this.ImageOff();
		this.SignOff();
		this.Expanded = false;
		this.TreeView.UpdateExpandedState();
	}
};

RadTreeNode.prototype.Highlight = function(e)
{	
	if (!this.Enabled) 
	{
		return;	
	}
	
	if (e)
	{		
		if (this.TreeView.MultipleSelect && (e.ctrlKey || e.shiftKey))
		{			
			if (this.Selected)
			{					
				this.TextElement().className = this.NodeCss;
				this.Selected = false;
				if (this.TreeView.SelectedNode == this)
				{
					this.TreeView.SelectedNode = null;
				}
				this.TreeView.UpdateSelectedState();				
				return;	
			}
		}		
		else
		{
			this.TreeView.UnSelectAllNodes();
		}
	}

	this.TextElement().className = this.NodeCssSelect;	
	this.TreeView.SelectNode(this);
	this.TreeView.FireEvent(this.TreeView.AfterClientHighlight, this);
};

RadTreeNode.prototype.ExecuteAction = function(e)
{	
	if (this.IsClientNode)
	{
		return;
	}
	
	if (this.TextElement().tagName == "A")
	{
	    this.TextElement().click();
	}
	else if (this.Action)
	{
	    this.TreeView.PostBack("NodeClick", this.ClientID);
	}
	
	if (e)
	{
		(document.all) ? e.returnValue = false : e.preventDefault();
	}
};

RadTreeNode.prototype.Select = function(e)
{
	if (this.TreeView.FireEvent(this.TreeView.BeforeClientClick, this, e) == false)
		return;
	
	if (this.Enabled) 
	{
		this.Highlight(e);
		this.TreeView.LastHighlighted = this;
		this.ExecuteAction();
	}
	else
	{
		(document.all) ? e.returnValue = false : e.preventDefault();
	}
	
	this.TreeView.FireEvent(this.TreeView.AfterClientClick, this, e);	
};

RadTreeNode.prototype.UnSelect = function()
{	
	if (this.TextElement().parentNode && this.TextElement().parentNode.tagName == "A")
	{
		this.TextElement().parentNode.className = this.NodeCss;
	}		
	this.TextElement().className = this.NodeCss;	
	
	this.Selected = false;
};

RadTreeNode.prototype.Disable = function()
{
	this.TextElement().className = this.TreeView.NodeCssDisable;
	this.Enabled = false;
	this.Selected = false;
	if (this.CheckElement() != null)
	{
		this.CheckElement().disabled = true;
	}
};

RadTreeNode.prototype.Enable = function()
{
	this.TextElement().className = this.NodeCss;
	this.Enabled = true;	
	if (this.CheckElement() != null)
	{
		this.CheckElement().disabled = false;
	}
};

RadTreeNode.prototype.Hover = function(e)
{	
	var sourceElement = (e.srcElement) ? e.srcElement : e.target;	
	if (this.TreeView.IsRootNodeTag(sourceElement))
	{	
		this.TreeView.SetBorderOnDrag(this, sourceElement, e);
		return;
	}	
	
	if (this.Enabled)
	{
		if (this.TreeView.FireEvent(this.TreeView.BeforeClientHighlight, this) == false)
		{
			return;
		}		
		
		this.TreeView.LastHighlighted = this;
		
		if (RadTreeView_DragActive != null && RadTreeView_DragActive.DragClone != null && (!this.Expanded) && this.ExpandOnServer != 1)
		{
			var nodeInstance = this;
			window.setTimeout( function() { nodeInstance.ExpandOnDrag(); } , 1000);	
		}
		
		if (!this.Selected)
		{
			this.TextElement().className = this.NodeCssOver;			
			if (this.Image)
			{				
				this.ImageElement().style.cursor = "hand";
			}
		}
		this.TreeView.FireEvent(this.TreeView.AfterClientHighlight, this);
	}
};

RadTreeNode.prototype.UnHover = function(e)
{
	var sourceElement = (e.srcElement) ? e.srcElement : e.target;
	
	if (this.TreeView.IsRootNodeTag(sourceElement))
	{		
		this.TreeView.ClearBorderOnDrag(sourceElement);
		return;
	}
	
	if (this.Enabled)
	{		
		this.TreeView.LastHighlighted = null;
		if (!this.Selected)
		{
			this.TextElement().className = this.NodeCss;			
			if (this.Image)
			{				
				this.ImageElement().style.cursor = "default";
			}			
		}
		
		this.TreeView.FireEvent(this.TreeView.AfterClientMouseOut, this);
	}
};

RadTreeNode.prototype.ExpandOnDrag = function()
{
	if (RadTreeView_DragActive != null && RadTreeView_DragActive.DragClone != null && (!this.Expanded))
	{		
		if (RadTreeView_Active.LastHighlighted == this)
		{			
			this.Expand();
		}
	}
};

RadTreeNode.prototype.CheckBoxClick = function(e)
{	
	if (this.Enabled)
	{
		if (this.TreeView.FireEvent(this.TreeView.BeforeClientCheck, this, e) == false)
		{
			(this.Checked) ? this.Check() : this.UnCheck();
			return;
		}			
		(this.Checked) ? this.UnCheck() : this.Check();				
		
		if (this.TreeView.AutoPostBackOnCheck)
		{
			this.TreeView.PostBack("NodeCheck", this.ClientID);			
			this.TreeView.FireEvent(this.TreeView.AfterClientCheck, this);
			return;
		}		
		
		this.TreeView.FireEvent(this.TreeView.AfterClientCheck, this);
	}
};

RadTreeNode.prototype.Check = function()
{
	if (this.CheckElement() != null)
	{
		this.CheckElement().checked = true;
		this.Checked = true;
		this.TreeView.UpdateCheckedState();		
	}	
};

RadTreeNode.prototype.UnCheck = function()
{
	if (this.CheckElement() != null)
	{
		this.CheckElement().checked = false;
		this.Checked = false;
		this.TreeView.UpdateCheckedState();
	}
};

RadTreeNode.prototype.IsSet = function(a) 
{
   return (a != null && a != "");
};

RadTreeNode.prototype.ImageOn = function() 
{
	var imageElement = document.getElementById(this.ClientID + "i");
	if (this.ImageExpanded != 0)
	{
		 imageElement.src = this.ImageExpanded;
	}
};

RadTreeNode.prototype.ImageOff = function()
{
	var imageElement = document.getElementById(this.ClientID + "i");
	if (this.Image != 0)
	{
		imageElement.src = this.Image;
	}
};

RadTreeNode.prototype.SignOn = function() 
{ 
	var signElement = document.getElementById(this.ClientID + "c");
	if (this.IsSet(this.SignImageExpanded)) 
	{
		signElement.src = this.SignImageExpanded;
	}
};

RadTreeNode.prototype.SignOff = function()
{ 
	var signElement = document.getElementById(this.ClientID + "c");
	if (this.IsSet(this.SignImage)) 
	{
		signElement.src = this.SignImage;
	}
};

RadTreeNode.prototype.TextElement = function()
{
	var divElement = document.getElementById(this.ClientID);	
	var spanElement = divElement.getElementsByTagName("span")[0];
	if (spanElement == null)
	{
		spanElement = divElement.getElementsByTagName("a")[0];
	}
	
	return spanElement;
};

RadTreeNode.prototype.ImageElement = function()
{
	return document.getElementById(this.ClientID + "i");
};

RadTreeNode.prototype.CheckElement = function()
{
	return document.getElementById(this.ClientID).getElementsByTagName("input")[0];
};

RadTreeNode.prototype.IsParent = function(node)
{
   var parent = this.Parent;
   while (parent != null)
   {
		if (node == parent)
			return true;
						
		parent = parent.Parent;		
   }
   
   return false;
};

RadTreeNode.prototype.StartEdit = function()
{
	if (this.EditEnabled)
	{		
		var htmlTextValue = this.Text;
		this.TreeView.EditMode = true;
		var parentElement = this.TextElement().parentNode;
		this.TreeView.EditTextElement = this.TextElement().cloneNode(true);		
		this.TextElement().parentNode.removeChild(this.TextElement());
		
		var instance = this;
		var inputElement = document.createElement("input");	
		inputElement.setAttribute("type","text");
		inputElement.setAttribute("size", this.Text.length + 3);	
		inputElement.setAttribute("value", htmlTextValue);			
		inputElement.className = this.TreeView.NodeCssEdit;	
		
		
		var nodeEditInstance = this;		
		inputElement.onblur = function() { nodeEditInstance.EndEdit(); };
		inputElement.onchange = function()	{ nodeEditInstance.EndEdit(); };
		inputElement.onkeypress = function(e) { nodeEditInstance.AnalyzeEditKeypress(e); };
		inputElement.onsubmit = function()	{ return false; };
	
		parentElement.appendChild(inputElement);
		this.TreeView.EditInputElement = inputElement;		
		inputElement.focus();
		
		inputElement.onselectstart = function(e) 
		{
			if (!e) e = window.event;
			if (e.stopPropagation)
			{
				e.stopPropagation();
			}
			else
			{
				e.cancelBubble = true;
			}
		};
		
		var startIndex = 0;
		var endIndex = this.Text.length;		
		if (inputElement.createTextRange)
		{
			var textRange = inputElement.createTextRange();
			textRange.moveStart("character", startIndex);
			textRange.moveEnd("character", endIndex);
			textRange.select();
		}
		else
		{
			inputElement.setSelectionRange(startIndex, endIndex);
		}
	}
};

RadTreeNode.prototype.EndEdit = function()
{
	this.TreeView.EditInputElement.onblur = null;
	this.TreeView.EditInputElement.onchange = null;
	var parentElement = this.TreeView.EditInputElement.parentNode;
	
	this.TreeView.EditInputElement.parentNode.removeChild(this.TreeView.EditInputElement);	
	parentElement.appendChild(this.TreeView.EditTextElement);
	
	if (this.TreeView.FireEvent(this.TreeView.AfterClientEdit, this, this.Text, this.TreeView.EditInputElement.value) != false)
	{	
		if (this.Text != this.TreeView.EditInputElement.value)
		{			
			var eventArguments = this.ClientID + ":" + this.TreeView.EscapeParameter(this.TreeView.EditInputElement.value);
			this.TreeView.PostBack("NodeEdit", eventArguments);
			return;
		}	
	}
		
	this.TreeView.EditMode = false;
	this.TreeView.EditInputElement = null;
	this.TreeView.EditTextElement = null;		
};

RadTreeNode.prototype.AnalyzeEditKeypress = function(e)
{	
	if (document.all) e = event;
	if (e.keyCode == 13)
	{		
		(document.all) ? e.returnValue = false : e.preventDefault();		        
        
        if (typeof(e.cancelBubble) != "undefined")
        {           
            e.cancelBubble = true;
        }
        		
		this.EndEdit();
				
		return false;
	}
	if (e.keyCode == 27)
	{
		this.TreeView.EditInputElement.value = this.TreeView.EditTextElement.innerHTML;
		this.EndEdit();
	}
	
	return true;
};

RadTreeNode.prototype.LoadNodesOnDemand = function(s, statusCode, url)
{	
	if (statusCode == 404)
	{
		var errorText = "CallBack URL not found: \n\r\n\r" + url  + "\n\r\n\rAre you using URL Rewriter? Please, try setting the AjaxUrl property to match the correct URL you need";
		alert(errorText);
		this.TreeView.FireEvent(this.TreeView.AfterClientCallBackError, this.TreeView);	
	}
	else
	{		
		try
		{
			eval(s);	
			var nodeArray = window[this.ClientID + "ClientData"];
			for (var i=0; i<nodeArray.length; i++)
			{
				nodeArray[i][17] = 0;
				this.TreeView.LoadNode(nodeArray[i], null, this);
			}
		}
		catch (e)
		{
			this.TreeView.FireEvent(this.TreeView.AfterClientCallBackError, this.TreeView);	
		}
	}
};

function RadTreeView(treeViewClientID)
{	
	if (window.tlrkTreeViews == null)
	{
		window.tlrkTreeViews = new Array();
	}
	
	if (window.tlrkTreeViews[treeViewClientID] != null)
	{
		oldTreeView = window.tlrkTreeViews[treeViewClientID];
		oldTreeView.Dispose();
	}
	
	tlrkTreeViews[treeViewClientID] = this;
	
	this.Nodes = new Array();
	this.AllNodes = new Array();
		
	this.ClientID = null;
	
	this.SelectedNode = null;	
	this.DragMode = false;
	this.DragSource = null;	
	this.DragClone = null;
	this.LastHighlighted = null;
	this.MouseInside = false;
	this.HtmlElementID = "";
	this.EditMode = false;
	this.EditTextElement = null;
	this.EditInputElement = null;	
	
	this.BeforeClientClick = null;
	this.BeforeClientHighlight = null;
	this.AfterClientHighlight = null;
	this.AfterClientMouseOut = null;
	this.BeforeClientDrop = null;
	this.AfterClientDrop = null;
	this.BeforeClientToggle = null;
	this.AfterClientToggle = null;
	this.BeforeClientContextClick = null;
	this.BeforeClientContextMenu = null;
	this.AfterClientContextClick = null;
	this.BeforeClientCheck = null;	
	this.AfterClientCheck = null;
	this.AfterClientMove = null;
	this.AfterClientFocus = null;
	this.BeforeClientDrag = null;
	this.AfterClientEdit = null;	
	this.AfterClientClick = null;
	this.BeforeClientDoubleClick = null;
	this.AfterClientCallBackError = null;
		
	this.DragAndDropBetweenNodes = false;
	this.AutoPostBackOnCheck = false;
	this.CausesValidation = true;
	this.ContextMenuVisible = false;
	this.ContextMenuName = null;
	this.ContextMenuNode = null;
	this.SingleExpandPath = false;
	this.ExpandDelay = 2;
	this.TabIndex = 0;
	this.AllowNodeEditing = false;
	this.LoadOnDemandUrl = null;
	this.LoadingMessage = "(loading ...)";
	this.LoadingMessagePosition = 0;
	this.LoadingMessageCssClass = "LoadingMessage";	
	this.NodeCollapseWired = false;
	
	// Drag & Drop between nodes implementation
	this.LastBorderElementSet = null;	
	this.LastDragPosition = "on";
	this.LastDragNode = null;
	
	this.IsBuilt = false;
};

RadTreeView.AlignImage = function(theImage)
{
	theImage.align = "absmiddle";
	theImage.style.display = "inline";	
	if (!document.all || window.opera)
	{
		if (theImage.nextSibling && theImage.nextSibling.tagName == "SPAN")
		{
		    theImage.nextSibling.style.verticalAlign = "middle";
		}
		if (theImage.nextSibling && theImage.nextSibling.tagName == "INPUT")
		{
		    theImage.nextSibling.style.verticalAlign = "middle";   
		}
	}
};


RadTreeView.prototype.OnInit = function()
{
	var ImageList = new Array();	
	
	this.PreloadImages(ImageList);	
	GlobalTreeViewImageList = ImageList;		
	
	var images = document.getElementById(this.Container).getElementsByTagName("IMG");
	for (var i=0; i<images.length; i++)
	{
		var index = images[i].className;
		if (index != null && index != "")
		{
			images[i].src = ImageList[index];
			RadTreeView.AlignImage(images[i]);
		}		
	}
	
	this.LoadTree(ImageList);
	
	var chkBoxes = document.getElementById(this.Container).getElementsByTagName("INPUT");
    for (var i=0; i<chkBoxes.length; i++)
    {       
        RadTreeView.AlignImage(chkBoxes[i]);
    }    
	
	if (document.addEventListener && (!RadTreeView_KeyboardHooked))
	{
		RadTreeView_KeyboardHooked = true;		
		document.addEventListener('keydown', this.KeyDownMozilla, false);
	}	
	
	if ( (!RadTreeView_MouseMoveHooked) && (this.DragAndDrop))
	{
		RadTreeView_MouseMoveHooked = true;
		if (document.attachEvent)
		{
			document.attachEvent('onmousemove', rtvMouseMove);
		}		
		if (document.addEventListener) 
		{
			document.addEventListener('mousemove', rtvMouseMove, false);		  
		}		
	}
	
	if (!RadTreeView_MouseUpHooked)
	{		
		RadTreeView_MouseUpHooked = true;		
		
		if (document.attachEvent)
		{
		  document.attachEvent('onmouseup', rtvMouseUp);
		}
		if (document.addEventListener) 
		{		  
		  document.addEventListener('mouseup', rtvMouseUp, false);		  
		}
	}
	
	this.AttachAllEvents();	
	this.IsBuilt = true;
};

RadTreeView.prototype.AttachAllEvents = function()
{
	var instance = this;
	var rootElement = document.getElementById(this.Container);
	rootElement.onfocus = function (e) { rtvDispatcher(instance.ClientID, "focus", e); };
	rootElement.onmouseover = function (e) { rtvDispatcher(instance.ClientID, "mover", e); };
	rootElement.onmouseout = function (e) { rtvDispatcher(instance.ClientID, "mout", e); };
	rootElement.oncontextmenu = function (e) { rtvDispatcher(instance.ClientID, "context", e); };
	rootElement.onscroll = function (e) 
	{
	    instance.Scroll();
	}	   
	rootElement.onclick = function (e) { rtvDispatcher(instance.ClientID, "mclick", e); };
	rootElement.ondblclick = function (e) { rtvDispatcher(instance.ClientID, "mdclick", e); };
	rootElement.onkeydown = function (e) { rtvDispatcher(instance.ClientID, "keydown", e); };
	rootElement.onselectstart = function() { return false; };
	rootElement.ondragstart = function() { return false; };
	
	if (this.DragAndDrop)
	{
		rootElement.onmousedown = function(e ) { rtvDispatcher(instance.ClientID,'mdown', e); };
	}
	
	if (window.attachEvent)
	{
		window.attachEvent("onunload", function()
			{
				instance.Dispose();
			}
		);
	}
	
	this.RootElement = rootElement;
};

RadTreeView.prototype.Dispose = function()
{
	if (this.disposed)
		return;
	
	this.disposed = true;
	
	try
	{
		var rootElement = this.RootElement;
		if (rootElement != null)
		{
			for (var prop in rootElement)
			{
				if (typeof(rootElement[prop]) == 'function')
				{
					rootElement[prop] = null;
				}
			}
			
			for (var prop in this)
			{
				if (prop != "Dispose")
				{
					this[prop] = null;
				}
			}
		}
		this.RootElement = null;
	}
	catch (err)
	{}
}	

RadTreeView.prototype.PreloadImages = function(images)
{
	var imageData = window[this.ClientID + "ImageData"]; 	
	for (var i=0; i<imageData.length; i++)
	{
		
		images[i]= imageData[i];
		
	}
};

RadTreeView.prototype.FindNode = function(node)
{	
	for (var i=0;i<this.AllNodes.length;i++)
	{
		if (this.AllNodes[i].ClientID == node)
		{
			return this.AllNodes[i];
		}		
	}
	return null;
};

RadTreeView.prototype.FindNodeByText = function(text)
{	
	for (var i=0;i<this.AllNodes.length;i++)
	{
		if (this.AllNodes[i].Text == text)
		{
			return this.AllNodes[i];
		}
	}
	return null;	
};

RadTreeView.prototype.FindNodeByValue = function(value)
{
	for (var i=0;i<this.AllNodes.length;i++)
	{
		if (this.AllNodes[i].Value == value)
		{
			return this.AllNodes[i];
		}
	}
	return null;
};

RadTreeView.prototype.IsChildOf = function(parent, child)
{
	if (child == parent)
	{
		return false;
	}
	
	while (child && (child != document.body))
	{
		if (child == parent)
		{
			return true;
		}
		try 
		{
			child = child.parentNode;
		}catch (e)
		{
			return false;
		}
	}

	return false;
};

RadTreeView.prototype.GetTarget = function (e)
{
	if (!e) return null;
		
    return e.target || e.srcElement;
};

RadTreeView.prototype.LoadTree = function(imageList)
{
	var cd = window[this.ClientID + "ClientData"];
	for (var i=0; i<cd.length; i++)
	{
		this.LoadNode(cd[i], imageList);		
	}
};

RadTreeView.prototype.LoadNode = function(cd, imageList, parentNode)
{
	var rtNode = new RadTreeNode();
	rtNode.ClientID = cd[0];
	rtNode.TreeView = this;
	var parentIndex = cd[17];
	if (parentIndex > 0)
	{
		rtNode.Parent = this.AllNodes[parentIndex-1];
	}
	if (parentNode != null)
	{
		rtNode.Parent = parentNode;
	}
	rtNode.NodeCss = this.NodeCss;
	rtNode.NodeCssOver = this.NodeCssOver;
	rtNode.NodeCssSelect = this.NodeCssSelect;
	rtNode.Text = cd[1];
	rtNode.Value = cd[2];
	rtNode.Category = cd[3];
	if (imageList != null)
	{
		rtNode.SignImage = imageList[cd[4]];
		rtNode.SignImageExpanded = imageList[cd[5]];		
	}
	else
	{
		rtNode.SignImage = GlobalTreeViewImageList[cd[4]]; 
		rtNode.SignImageExpanded = GlobalTreeViewImageList[cd[5]];
	}
	if (cd[6] > 0)
	{
		rtNode.Image = imageList[cd[6]];
	}
	if (cd[7] > 0)
	{
		rtNode.ImageExpanded = imageList[cd[7]];
	}
	rtNode.Selected = cd[8];
	if (rtNode.Selected)
	{
		this.SelectedNode = rtNode;
	}
	rtNode.Checked = cd[9];
	rtNode.Enabled = cd[10];
	rtNode.Expanded = cd[11];
	rtNode.Action = cd[12];
	if (this.IsSet(cd[13])) rtNode.NodeCss = cd[13];
	if (this.IsSet(cd[14])) rtNode.ContextMenuName = cd[14];
	this.AllNodes[this.AllNodes.length] = rtNode;
	
	if (rtNode.Parent != null)
	{
		rtNode.Parent.Nodes[rtNode.Parent.Nodes.length] = rtNode;
	}
	else
	{
		this.Nodes[this.Nodes.length] = rtNode;
	}
	
	rtNode.Index = cd[16];
	rtNode.DragEnabled = cd[18];
	rtNode.DropEnabled = cd[19];
	rtNode.ExpandOnServer = cd[20];
	if (this.IsSet(cd[21])) rtNode.NodeCssOver = cd[21];
	if (this.IsSet(cd[22])) rtNode.NodeCssSelect = cd[22];	
	rtNode.Level = cd[23];
	rtNode.ID = cd[24];
	rtNode.IsClientNode = cd[25];
	rtNode.EditEnabled = cd[26];
	rtNode.Attributes = cd[27];
};

RadTreeView.prototype.Toggle = function(node) {  this.FindNode(node).Toggle(); };
RadTreeView.prototype.Select = function(node, e) { this.FindNode(node).Select(e); };
RadTreeView.prototype.Hover = function(node, e) { var node = this.FindNode(node); if (node) node.Hover(e); };
RadTreeView.prototype.UnHover = function(node, e) { var node = this.FindNode(node); if (node) node.UnHover(e); };
RadTreeView.prototype.CheckBoxClick = function(node, e) { this.FindNode(node).CheckBoxClick(e); };
RadTreeView.prototype.Highlight = function(node, e) {  this.FindNode(node).Highlight(e); };

RadTreeView.prototype.SelectNode = function(node)
{
	this.SelectedNode = node;
	node.Selected = true;
	this.UpdateSelectedState();
};

RadTreeView.prototype.GetSelectedNodes = function()
{	
	var selNodes = new Array();
	for (var i=0; i<this.AllNodes.length; i++)
	{
		if (this.AllNodes[i].Selected)		
			selNodes[selNodes.length] = this.AllNodes[i];		
	}		
	return selNodes;
};

RadTreeView.prototype.UnSelectAllNodes = function(node)
{	
	for (var i=0; i<this.AllNodes.length;i++)
	{
		if (this.AllNodes[i].Selected && this.AllNodes[i].Enabled)		
		{			
			this.AllNodes[i].UnSelect();
		}
	}
};

RadTreeView.prototype.KeyDownMozilla = function(e) 
{
    if(navigator.userAgent.toUpperCase().indexOf('SAFARI') != -1 && e.keyCode != 32 && e.keyCode != 107 && e.keyCode != 109 )
    {
        safariKeyDownFlag = !safariKeyDownFlag;
        if(safariKeyDownFlag) { return; }
    }

	var LastActiveRadTreeView = RadTreeView_Active;	    

	if (LastActiveRadTreeView)
	{	    
	    var eventTarget = LastActiveRadTreeView.GetTarget(e);
	    if(eventTarget.tagName.toUpperCase() == "BODY" || eventTarget.tagName.toUpperCase() == "HTML" || LastActiveRadTreeView.IsChildOf(eventTarget, LastActiveRadTreeView.RootElement) || eventTarget == LastActiveRadTreeView.RootElement)
	    {	
	        if (!LastActiveRadTreeView.IsBuilt) return;	
	        if (LastActiveRadTreeView.SelectedNode != null)
	        {		
		        if (LastActiveRadTreeView.EditMode) return;
		        if(e.keyCode == 107 || e.keyCode == 109 || e.keyCode == 37 || e.keyCode == 39)
			        LastActiveRadTreeView.SelectedNode.Toggle();

		        if(e.keyCode == 40 && LastActiveRadTreeView.SelectedNode.NextVisible() != null)
			        LastActiveRadTreeView.SelectedNode.NextVisible().Highlight(e);
		        if(e.keyCode == 38 && LastActiveRadTreeView.SelectedNode.PrevVisible() != null)
			        LastActiveRadTreeView.SelectedNode.PrevVisible().Highlight(e);
		        if(e.keyCode == 13)
		        {
			        if (LastActiveRadTreeView.FireEvent(LastActiveRadTreeView.BeforeClientClick, LastActiveRadTreeView.SelectedNode, e) == false)
			        {
				        return;
			        }
			        LastActiveRadTreeView.SelectedNode.ExecuteAction();				
			        LastActiveRadTreeView.FireEvent(LastActiveRadTreeView.AfterClientClick, LastActiveRadTreeView.SelectedNode, e);
		        }
		        if(e.keyCode == 32)
			        LastActiveRadTreeView.SelectedNode.CheckBoxClick();			
		        if (e.keyCode == 113 && LastActiveRadTreeView.AllowNodeEditing)		
			        LastActiveRadTreeView.SelectedNode.StartEdit();		
	        }
	        else
	        {
        		if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 32)
	            {
		            LastActiveRadTreeView.Nodes[0].Highlight();
	            }
	        }			
	    }
	}
};

RadTreeView.prototype.KeyDown = function(e) 
{	
	if (this.EditMode) return;
	var node = this.SelectedNode;	
	if (node != null)
	{	
		if(e.keyCode == 107 || e.keyCode == 109 || e.keyCode == 37 || e.keyCode == 39)
			node.Toggle();			
		if(e.keyCode == 40 && node.NextVisible() != null) 
			node.NextVisible().Highlight(e);
		if(e.keyCode == 38 && node.PrevVisible() != null)
			node.PrevVisible().Highlight(e);
		if(e.keyCode == 13)		
		{
			if (this.FireEvent(this.BeforeClientClick, this.SelectedNode, e) == false)
			{
				return;
			}			
			node.ExecuteAction(e);				
			this.FireEvent(this.AfterClientClick, this.SelectedNode, e);
		}
		if(e.keyCode == 32)
		{
			node.CheckBoxClick();
			(document.all) ? e.returnValue = false : e.preventDefault();
		}
		if (e.keyCode == 113 && this.AllowNodeEditing)		
		{
			node.StartEdit();		
		}
	}
	else
	{
		if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 32)
		{
			this.Nodes[0].Highlight();
		}
	}
};

RadTreeView.prototype.UpdateState = function() 
{
	this.UpdateExpandedState();
	this.UpdateCheckedState();
	this.UpdateSelectedState();
};

RadTreeView.prototype.UpdateExpandedState = function() 
{
	var expandedState = "";	
	for (var i=0; i<this.AllNodes.length; i++)
	{
		var isExpanded = (this.AllNodes[i].Expanded) ? "1" : "0";
		expandedState += isExpanded;
	}
	document.getElementById(this.ClientID + "_expanded").value = expandedState;
};

RadTreeView.prototype.UpdateCheckedState = function() 
{
	var checkedState = "";
	for (var i=0; i<this.AllNodes.length; i++)
	{
		var isChecked = (this.AllNodes[i].Checked) ? "1" : "0";
		checkedState += isChecked;
	}
	document.getElementById(this.ClientID + "_checked").value = checkedState;
};

RadTreeView.prototype.UpdateSelectedState = function() 
{
	var selectedState = "";	
	for (var i=0; i<this.AllNodes.length; i++)
	{
		var isSelected = (this.AllNodes[i].Selected) ? "1" : "0";
		selectedState += isSelected;
	}
	document.getElementById(this.ClientID + "_selected").value = selectedState;	
};

RadTreeView.prototype.Scroll = function()
{	
	document.getElementById(this.ClientID + "_scroll").value = document.getElementById(this.Container).scrollTop;	
};

RadTreeView.prototype.ContextMenuClick = function(e,p1,p2,p3) 
{
	instance = this;
	window.setTimeout( function() { instance.HideContextMenu() }, 10);	
	
	if (this.FireEvent(this.BeforeClientContextClick, this.ContextMenuNode, p1, p3) == false)
	{
		return;	
	}
	
	if (p2)
	{
	    var argumentsList = this.ContextMenuNode.ClientID + ":" + this.EscapeParameter(p1) + ":" + this.EscapeParameter(p3);
		this.PostBack("ContextMenuClick", argumentsList);		
	}
};

RadTreeView.prototype.ContextMenu = function(e, nodeID) 
{
	var src = (e.srcElement) ? e.srcElement : e.target;
	var node = this.FindNode(nodeID);
	
	if (node != null && this.BeforeClientContextMenu != null)
	{		
		var oldNode = this.SelectedNode;		
		if (this.FireEvent(this.BeforeClientContextMenu, node, e, oldNode) == false)
		{
			return;
		}		
		this.Highlight(nodeID, e, oldNode);		
	}
	
	if (node != null && node.ContextMenuName != null && node.Enabled)
	{
		if (!this.ContextMenuVisible)
		{			
			this.ContextMenuNode = node;
			if (!node.Selected)
			{			
				this.Highlight(nodeID,e);
			}			
			this.ShowContextMenu(node.ContextMenuName, e);
			document.all ? e.returnValue = false : e.preventDefault();
		}		
	}
};

RadTreeView.prototype.ShowContextMenu = function(name, e)
{	
	if (!document.readyState || document.readyState == "complete")
	{		
		var menuID = "rtvcm" + this.ClientID + name;
		var menu = document.getElementById(menuID);
		if (menu)
		{
			var menuClone = menu.cloneNode(true);
			menuClone.id = menuID + "_clone";
			document.body.appendChild(menuClone);
			
			menuClone = document.getElementById(menuID + "_clone");
			
			menuClone.style.left = this.CalculateXPos(e) + "px";
			menuClone.style.top = this.CalculateYPos(e) + "px";
			
			menuClone.style.position = "absolute";
			menuClone.style.display = "block";
			this.ContextMenuVisible = true;
			this.ContextMenuName = name;		
			
			document.all ? e.returnValue = false : e.preventDefault();			
		}
	}
};

RadTreeView.prototype.CalculateYPos = function(e)
{
	if (document.compatMode && document.compatMode == "CSS1Compat")
	{
		return (e.clientY + document.documentElement.scrollTop);
	}
	return (e.clientY + document.body.scrollTop);
};

RadTreeView.prototype.CalculateXPos = function(e)
{
	if (document.compatMode && document.compatMode == "CSS1Compat")
	{
		return (e.clientX + document.documentElement.scrollLeft);
	}
	return (e.clientX + document.body.scrollLeft);
};

RadTreeView.prototype.HideContextMenu = function()
{	
	if (!document.readyState || document.readyState == "complete")
	{		
		var contextMenuElement = document.getElementById("rtvcm" + this.ClientID + this.ContextMenuName + "_clone");
		if (contextMenuElement)
		{
			document.body.removeChild(contextMenuElement);
		}
		this.ContextMenuVisible = false;
	}
};

RadTreeView.prototype.MouseClickDispatcher = function(e) 
{
	var src = (e.srcElement) ? e.srcElement : e.target;
	var nodeID = rtvGetNodeID(e);
	
	if (nodeID != null && src.tagName != "DIV")
	{
		var theNode = this.FindNode(nodeID);
		if (theNode.Selected)
		{
			if (this.AllowNodeEditing)
			{
				theNode.StartEdit();
				return;
			}
			else
			{
				this.Select(nodeID, e);
			}
		}
		else
		{
			this.Select(nodeID, e);
		}
	}
	if (src.tagName == "IMG")
	{
		var imageID = src.className;
		if (this.IsSet(imageID) && this.IsToggleImage(imageID))
		{
			this.Toggle(src.parentNode.id);	
		}
	}
	if (src.tagName == "INPUT" && rtvInsideNode(src))
	{				
		this.CheckBoxClick(src.parentNode.id, e);		
	
	}
};

RadTreeView.prototype.IsToggleImage = function(n) 
{
	return (n == 1 || n == 2 || n == 5 || n == 6 || n == 7 || n == 8 || n == 10 || n == 11);
};


RadTreeView.prototype.DoubleClickDispatcher = function(e, nodeID) 
{
	var node = this.FindNode(nodeID);
	
	if (this.FireEvent(this.BeforeClientDoubleClick, node) == false)
	{
		return;
	}
	this.Toggle(nodeID);
};

RadTreeView.prototype.MouseOverDispatcher = function(e, nodeID) 
{
	this.Hover(nodeID, e);	
};

RadTreeView.prototype.MouseOutDispatcher = function(e, nodeID) 
{
	this.UnHover(nodeID, e);
	
	this.LastDragNode = null;
	this.LastHighlighted = null;
};

RadTreeView.prototype.MouseDown = function(e) 
{	
	if (this.LastHighlighted != null && this.DragAndDrop)
	{	
		if (this.FireEvent(this.BeforeClientDrag, this.LastHighlighted) == false) return;
		if (!this.LastHighlighted.DragEnabled) return;
		if (e.button == 2) return;
		
		this.DragSource = this.LastHighlighted;
		this.DragClone = document.createElement("div");
		document.body.appendChild(this.DragClone);
		
		RadTreeView_DragActive = this;				
		
		var res = "";
		if (this.MultipleSelect && (this.SelectedNodesCount() > 1))
		{
			for (var i=0; i<this.AllNodes.length; i++)
			{
				if (this.AllNodes[i].Selected)
				{
					if (this.AllNodes[i].Image)
					{
						var img = this.AllNodes[i].ImageElement();
						var imgClone = img.cloneNode(true);
						this.DragClone.appendChild(imgClone);
					}
					
					var nodeTextClone = this.AllNodes[i].TextElement().cloneNode(true);					
					nodeTextClone.className = this.AllNodes[i].NodeCss;
					nodeTextClone.style.color = "gray";
					this.DragClone.appendChild(nodeTextClone);
					this.DragClone.appendChild(document.createElement("BR"));
				}
				res = res + "text";
			}
		}
		
		if (res == "")
		{			
			if (this.LastHighlighted.Image)
			{						
				var img = this.LastHighlighted.ImageElement();
				var imgClone = img.cloneNode(true);						
				this.DragClone.appendChild(imgClone);
			}
									
			var nodeTextClone = this.LastHighlighted.TextElement().cloneNode(true);			
			nodeTextClone.className = this.LastHighlighted.NodeCss;			
			nodeTextClone.style.color = "gray";
			this.DragClone.appendChild(nodeTextClone);
		}
		
		this.DragClone.style.position = "absolute";
		this.DragClone.style.display = "none";
		
		if (e.preventDefault)
		{
			e.preventDefault();
		}
		//(document.all) ? e.returnValue = false : e.preventDefault();
	}	
};

RadTreeView.prototype.SelectedNodesCount = function()
{
	var count = 0;
	for (var i=0; i<this.AllNodes.length; i++)
	{
		if (this.AllNodes[i].Selected) count++;
	}
	
	return count;
};

RadTreeView.prototype.FireEvent = function(handler, a, b, c, d) 
{
	if (!handler)
	{
		return true;
	}	
	RadTreeViewGlobalFirstParam = a;
	RadTreeViewGlobalSecondParam = b;
	RadTreeViewGlobalThirdParam = c;	
	RadTreeViewGlobalFourthParam = d;	
	var s = handler + "(RadTreeViewGlobalFirstParam, RadTreeViewGlobalSecondParam, RadTreeViewGlobalThirdParam, RadTreeViewGlobalFourthParam);";			
	return eval(s);	
};

RadTreeView.prototype.Focus = function(e) 
{
	this.FireEvent(this.AfterClientFocus, this);
};

RadTreeView.prototype.IsSet = function(a) 
{
   return (a != null && a != "");
};


RadTreeView.prototype.GetX = function(obj) { var curleft = 0; if (obj.offsetParent)	{ while (obj.offsetParent) { curleft += obj.offsetLeft;	obj = obj.offsetParent;	} }	else if (obj.x)	curleft += obj.x; return curleft; };
RadTreeView.prototype.GetY = function(obj) { var curtop = 0; if (obj.offsetParent) { while (obj.offsetParent) {	curtop += obj.offsetTop; obj = obj.offsetParent; } } else if (obj.y) curtop += obj.y; return curtop; };

RadTreeView.prototype.PostBack = function(eventName, eventArguments)
{   
    var delimitedString = eventName + "#" + eventArguments;
    if (this.PostBackOptionsClientString)
    {                
        var postBackEventOptions = this.PostBackOptionsClientString.replace(/@@arguments@@/g, delimitedString);
	    if (typeof(WebForm_PostBackOptions) != "undefined" || 
	        postBackEventOptions.indexOf("_doPostBack") > -1 || 
	        postBackEventOptions.indexOf("AsyncRequest") > -1 ||
	        postBackEventOptions.indexOf("AsyncRequest") > -1 ||
	        postBackEventOptions.indexOf("AjaxNS") > -1)
	    {	        
	        eval(postBackEventOptions);
	    }
	}
	else
	{	    
	    if (this.CausesValidation)
		{
		    if (!(typeof(Page_ClientValidate) != 'function' || Page_ClientValidate()))
			{
			    return;
			}
		}  	   
	   
	   var postBackString = this.PostBackFunction.replace(/@@arguments@@/g, delimitedString);	   
	   eval(postBackString);
    }
}; 

RadTreeView.prototype.EscapeParameter = function(param)
{
    var escapedParam = param.replace(/'/g,"&squote");
    escapedParam = escapedParam.replace(/#/g,"&ssharp");
	escapedParam = escapedParam.replace(/:/g,"&scolon");
	escapedParam = escapedParam.replace(/\\/g, "\\\\");
	
	return escapedParam;
};

RadTreeView.prototype.IsRootNodeTag = function(element)
{
	if (element && element.tagName == "DIV" && element.id.indexOf(this.ID) > -1)
	{
		return true;
	}
	
	return false;	
};

RadTreeView.prototype.SetBorderOnDrag = function(node, sourceElement, e)
{
	if (this.DragAndDropBetweenNodes && this.IsDragActive() /*&& this.DragClone != null */)
	{
		this.LastDragNode = node;
		
		var mouseY = this.CalculateYPos(e);
		var elementY = this.GetY(sourceElement);		
		
		if (mouseY < elementY + node.TextElement().offsetHeight)
		{
			sourceElement.style.borderTop = "1px dotted black";			
			this.LastDragPosition = "above";			
		}
		else
		{
			sourceElement.style.borderBottom = "1px dotted black";
			this.LastDragPosition = "below";
		}
		
		this.LastBorderElementSet = sourceElement;
	}
};

RadTreeView.prototype.ClearBorderOnDrag = function(sourceElement)
{
	if (sourceElement && this.DragAndDropBetweenNodes && this.IsDragActive())
	{
		sourceElement.style.borderTop = "";
		sourceElement.style.borderBottom = "";
		this.LastDragPosition = "over";
	}	
};

RadTreeView.prototype.IsDragActive = function()
{
	for (var key in tlrkTreeViews)
	{
		if ((typeof(tlrkTreeViews[key]) != "function") && tlrkTreeViews[key].DragClone != null)
		{
			return true;
		}
	}
	
	return false;
};

function rtvIsAnyContextMenuVisible()
{
	for (var key in tlrkTreeViews)
		if ((typeof(tlrkTreeViews[key]) != "function") && tlrkTreeViews[key].ContextMenuVisible)
			return true;
			
	return false;
};


function rtvAdjustScroll()
{	
	if (RadTreeView_DragActive == null || RadTreeView_DragActive.DragClone == null || RadTreeView_Active == null)
	{
		return;
	}	
	
	var tree = RadTreeView_Active;
	var treeElement = document.getElementById(RadTreeView_Active.Container);	
	var topY, bottomY;	
	
	topY = tree.GetY(treeElement);
	bottomY = topY + treeElement.offsetHeight;	
	
	if ((RadTreeView_MouseY - topY) < 50 && treeElement.scrollTop > 0)
	{		
		treeElement.scrollTop = treeElement.scrollTop - 10;	
		tree.Scroll();		
		RadTreeView_ScrollTimeout = window.setTimeout( function() { rtvAdjustScroll(); }, 100);		
	}	
	else if ((bottomY - RadTreeView_MouseY) < 50 && treeElement.scrollTop < (treeElement.scrollHeight - treeElement.offsetHeight +16))
	{
		treeElement.scrollTop = treeElement.scrollTop + 10;
		tree.Scroll();		
		RadTreeView_ScrollTimeout = window.setTimeout( function() { rtvAdjustScroll(); }, 100);		
	}
};

function rtvMouseUp(e) 
{	
	if (RadTreeView_Active == null)	return;
		
	if (e && !e.ctrlKey)
	{
		for (var key in tlrkTreeViews)
		{
			if ((typeof(tlrkTreeViews[key]) != "function") && tlrkTreeViews[key].ContextMenuVisible)
			{
				contextMenuToBeHidden = tlrkTreeViews[key];
				//window.setTimeout("contextMenuToBeHidden.HideContextMenu()", 10);
				window.setTimeout( function()
				                    {
				                       if (contextMenuToBeHidden)
				                       {				                            
				                            contextMenuToBeHidden.HideContextMenu();
				                       }
				                    }, 10);
				return;
			}
		}	
	}
	
	
	if (RadTreeView_DragActive == null || RadTreeView_DragActive.DragClone == null)
	{
		return;
	}
	
	(document.all) ? e.returnValue = false : e.preventDefault();
	
	
	var sourceNode = RadTreeView_DragActive.DragSource;	
	var destNode = RadTreeView_Active.LastHighlighted;
	var destTree = RadTreeView_Active;
	
	var lastDragPosition = "over";
	var lastDragNode;
	
	if (destTree.LastBorderElementSet)
	{		
		lastDragPosition = destTree.LastDragPosition;
		lastDragNode = destTree.LastDragNode;				
		destTree.ClearBorderOnDrag(destTree.LastBorderElementSet);		
	}
	
	if (lastDragNode)
	{
		destNode = lastDragNode;
	}
	
	document.body.removeChild(RadTreeView_DragActive.DragClone);
	RadTreeView_DragActive.DragClone = null;	
	
	if (destNode != null && destNode.DropEnabled == false)	return;			
	if (sourceNode == destNode)	return;	
	if (RadTreeView_DragActive.FireEvent(RadTreeView_DragActive.BeforeClientDrop, sourceNode, destNode, e, lastDragPosition) == false) return;	
	if (sourceNode.IsClientNode || ( (destNode != null) && destNode.IsClientNode)) return;
		
	var sourceString = RadTreeView_DragActive.ClientID + "#" + sourceNode.ClientID + "#";
	var destString = "";		
	
	
	if (destNode == null)
	{		
		destString = "null" + "#" + RadTreeView_DragActive.HtmlElementID;
	}
	else	
	{		
		destString = destTree.ClientID + "#" + destNode.ClientID + "#" + lastDragPosition;
	}
	
	if (destNode == null && RadTreeView_DragActive.HtmlElementID == "")
	{
		return;
	}
	
	var postBackString = sourceString + destString;
    //alert(postBackString);	
	RadTreeView_DragActive.PostBack("NodeDrop", postBackString);	
	RadTreeView_DragActive.FireEvent(RadTreeView_DragActive.AfterClientDrop, sourceNode, destNode, e);	
	
	RadTreeView_DragActive = null;
};

function rtvMouseMove(e)
{	
	if (rtvIsAnyContextMenuVisible())
	{
		return;
	}
		
	if (RadTreeView_DragActive != null && RadTreeView_DragActive.DragClone != null)	
	{	    
		var newX, newY;
		newX = RadTreeView_DragActive.CalculateXPos(e) + 8;
		newY = RadTreeView_DragActive.CalculateYPos(e) + 4;
		RadTreeView_MouseY = newY;
		rtvAdjustScroll();
		RadTreeView_DragActive.DragClone.style.zIndex = 999;
		RadTreeView_DragActive.DragClone.style.top = newY + "px";
		RadTreeView_DragActive.DragClone.style.left = newX + "px";
		RadTreeView_DragActive.DragClone.style.display = "block";
		RadTreeView_DragActive.FireEvent(RadTreeView_DragActive.AfterClientMove, e);
	}	
};

function rtvNodeExpand(a, id, delay)
{
	var scrollDiv = document.getElementById(id);
	var heightLimit = scrollDiv.scrollHeight;	
	var step = (heightLimit - a) / delay;
	var height = a + step;
	
	if (height > heightLimit - 1)
	{		
		scrollDiv.style.height = "";		
	    scrollDiv.firstChild.style.position = ""; 
	}
	else
	{
		scrollDiv.style.height = height + "px";	
		window.setTimeout("rtvNodeExpand(" + height + "," + "'" + id + "'," + delay +  ");", 5);	
	}	
};

function rtvNodeCollapse(a, id, delay)
{		
		var scrollDiv = document.getElementById(id);
		var heightLimit = scrollDiv.scrollHeight;
		var step = (heightLimit - Math.abs(heightLimit - a)) / delay;
		var height = a - step;	
		
		if (height <= 3)
		{
			scrollDiv.style.height = "";		
			scrollDiv.style.display = "none";
			scrollDiv.firstChild.style.position = "";    
		}	
		else
		{
			scrollDiv.style.height = height + "px";	
			window.setTimeout("rtvNodeCollapse(" + height + "," + "'" + id + "'," + delay + " );", 5);	
		}
};

function rtvGetNodeID(e)
{
	if (RadTreeView_Active == null) return;
	var target = (e.srcElement) ? e.srcElement : e.target;	
	
    if (target.nodeType == 3)
    {
        target = target.parentNode;
    }
    
	if (target.tagName == "IMG" && target.nextSibling)
	{
		var index = target.className;		
		if (index)
		{
			index = parseInt(index);
			if (index > 12)
			{
				target = target.nextSibling;
			}
		}
	}	
   
	if (target.id.indexOf(RadTreeView_Active.ID) > -1 && target.tagName == "DIV")
	{
		return target.id;
	}
	
	while (target != null)
	{
		if ((target.tagName == "SPAN" || target.tagName == "A") && rtvInsideNode(target))
		{			
			return target.parentNode.id;
		}
		target = target.parentNode;
	}
	
	return null;
};

function rtvInsideNode(element)
{
	if (element.parentNode && element.parentNode.tagName == "DIV" && element.parentNode.id.indexOf(RadTreeView_Active.ID) > -1)
	{
		return element.parentNode.id;
	}
};

function rtvDispatcher(t,w,e,p1,p2,p3)
{	
	if (!e)
	{
		e = window.event;
	}	
	
	if (tlrkTreeViews)
	{	
		//var nodeID;
		//if (w != "scroll")
		//{
		var nodeID = rtvGetNodeID(e);
		//}		
		var targetTree = tlrkTreeViews[t];		
		if (!targetTree.IsBuilt) return;		
		if (rtvIsAnyContextMenuVisible() && w != "mclick" && w != "cclick") return;
		if (targetTree.EditMode) return;
		RadTreeView_Active = targetTree;
		
		var isMozilla = window.netscape && !window.opera;
		var isSafari = (navigator.userAgent.toLowerCase().indexOf("safari") != -1);
						
		switch (w)
		{
			case "mover"	 : if (nodeID != null) targetTree.MouseOverDispatcher(e, nodeID); break;
			case "mout"		 : if (nodeID != null) targetTree.MouseOutDispatcher(e, nodeID); break;
			case "mclick"	 : targetTree.MouseClickDispatcher(e); break;
			case "mdclick"	 : if (nodeID != null) targetTree.DoubleClickDispatcher(e, nodeID); break;
			case "mdown"	 : targetTree.MouseDown(e); break;
			case "mup"		 : targetTree.MouseUp(e); break;
			case "context"   : if (nodeID != null) { targetTree.ContextMenu(e, nodeID); return false; } break;
			case "cclick"	 : targetTree.ContextMenuClick(e,p1,p2,p3); break;
			//case "scroll"	 : targetTree.Scroll(e); break;
			case "focus"	 : targetTree.Focus(e);
			case "keydown"	 : if (!isMozilla && !isSafari) targetTree.KeyDown(e);
		}
	}
};

function rtvAppendStyleSheet(clientID, pathToCssFile)
{
	var isMacIe = (navigator.appName == "Microsoft Internet Explorer") &&
		((navigator.userAgent.toLowerCase().indexOf("mac") != -1) ||
		(navigator.appVersion.toLowerCase().indexOf("mac") != -1));

	var isSafari = (navigator.userAgent.toLowerCase().indexOf("safari") != -1);

	if (isMacIe || isSafari)
	{
		document.write("<" + "link" + " rel='stylesheet' type='text/css' href='" + pathToCssFile + "'>");
	}
	else
	{
		var linkObject = document.createElement("LINK");
		linkObject.rel = "stylesheet";
		linkObject.type = "text/css";
		linkObject.href = pathToCssFile;
		document.getElementById(clientID + "StyleSheetHolder").appendChild(linkObject);
	}
};

function rtvInsertHTML(where, html)
{
		if (where.tagName == "A")
		{
			where = where.parentNode;
		}
		
		if (document.all)
		{
			where.insertAdjacentHTML("beforeEnd", html);
		}
		else
		{
			var r = where.ownerDocument.createRange();
			r.setStartBefore(where);
			var parsedNode = r.createContextualFragment(html);
			where.appendChild(parsedNode);
		}
};

//BEGIN_ATLAS_NOTIFY
if (typeof(Sys) != "undefined")
{
	if (Sys.Application != null && Sys.Application.notifyScriptLoaded != null)
	{
		Sys.Application.notifyScriptLoaded();
	}
}
//END_ATLAS_NOTIFY