function clsTree(treeHTMLElement)
{
	using("XMLLib")
	using("helperLib")

    var me = this
    var thisElement = treeHTMLElement


    top.helperLib.attachEvents(window, thisElement, "onclick", Click)
    top.helperLib.attachEvents(window, thisElement, "onmousedown", MouseDown)
    top.helperLib.attachEvents(window, thisElement, "onmouseover", MouseOver)
    top.helperLib.attachEvents(window, thisElement, "onmouseout", MouseOut)
    top.helperLib.attachEvents(window, thisElement, "onmouseup", MouseUp)
    top.helperLib.attachEvents(window, thisElement, "onselectstart", SelectStart)
    top.helperLib.attachEvents(window, thisElement, "ondblclick", DblClick)
    top.helperLib.attachEvents(window, thisElement, "oncontextmenu", rightClick)
    top.helperLib.attachEvents(window, thisElement, "onkeypress", KeyDown)
    

	var eventHandler = new top.helperLib.clsEventHandler();
	this.attachEvents = eventHandler.attachEvent;
	this.detachEvents = eventHandler.attachEvent;
	this.raiseEvent = eventHandler.raiseEvent;
	

    this.State              = new Object()
    me.State.toString       = getState;
    this.isRootNode         = new Object()
    me.isRootNode.toString  = isRootNode;

    this.setNodeXmlElement  = SetNodeXMLElement;
    this.initialise         = Init
    this.setNodeXMLbyNodeId = setNodeXMLbyNodeId
    this.releaseContext     = releaseContext    
    this.rebuild            = rebuild
    this.AddNode            = AddNode    
    this.addNodeByXML       = addNodeByXML
    this.expandAll          = expandAll
    this.collapseAll        = collapseAll
    this.RemoveTreeNode     = RemoveTreeNode
    this.GetPath            = GetPath
    this.GetId              = GetId
    this.GetDef             = GetDef
    this.GetType            = GetType
    this.GetText            = GetText
    this.copyNode           = copyNode
    this.pasteNode          = pasteNode
    this.cutNode            = cutNode
    this.moveNodeUp         = moveNodeUp
    this.moveNodeDown       = moveNodeDown
    this.pasteTreeNode      = pasteTreeNode
    this.movenext           = MoveNext
    this.moveprevious       = MovePrevious
    this.refreshUI          = refreshUI
    this.Sync               = Sync
    this.SelectNode         = SelectNode
    this.SetCurrentNodeTitle =  SetCurrentNodeTitle
    this.setCurrentNodeTitleByID = setCurrentNodeTitleByID
    this.SelectNodeById     = SelectNodeById
    this.GetNodeObjectById  = GetNodeObjectById
    this.checkSelectedNodeChildren =checkSelectedNodeChildren
    this.dispose            = dispose    
    
	function dispose()
	{
		try{eventHandler.dispose()}catch(e){}
		me.attachEvents = null;
		me.detachEvents = null;
		me.raiseEvent = null;
	}
    

    var m_objTreeNodeState
    var objLI_Current = null;
    var m_nodeClipboard,m_tran,m_timer,m_objContextSelection;
    var strRootPath = "";
    
    var sNewParentStartTag = '<div class="clscontainer hide"  type="container">'
    var sNewParentEndTag ='<span></span></div>'
    var m_objXSLDoc
    var m_bSlidingNow = false //value used for checking the current sliding state of the left menu bar when used in XP style
    var objXMLDocTreeTemplate = top.XMLLib.objXMLDocTemplate.cloneNode(true);//new ActiveXObject("Microsoft.XMLDOM");
    var xsl = "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"
    
    //works only in IE. do not remember why this is there. Need to check and remove later
    
    if(objXMLDocTreeTemplate.validateOnParse != null)
    {
        objXMLDocTreeTemplate.setProperty("SelectionNamespaces", xsl);
        objXMLDocTreeTemplate.setProperty("SelectionLanguage", "XPath");
        objXMLDocTreeTemplate.validateOnParse = false;
        objXMLDocTreeTemplate.resolveExternals = false;
        objXMLDocTreeTemplate.preserveWhiteSpace = false;
    }
    
    objXMLDocTreeTemplate.async = false;
    

    m_objXSLDoc = objXMLDocTreeTemplate.cloneNode(true) //;objXSLDoc.async = false;
    m_objXSLDoc.loadXML('<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="xml" omit-xml-declaration="yes" /><xsl:param name="pathPrefix">' + top.helperLib.wsfMapPath("") + '</xsl:param><xsl:param name="defaultparentimage">' + top.helperLib.wsfMapPath("/widgets/assets/TreeDefaultParent16.gif") + '</xsl:param><xsl:param name="defaultleafimage">' + top.helperLib.wsfMapPath("/widgets/assets/tasknew16.gif") + '</xsl:param><xsl:param name="HideParentImages">no</xsl:param><xsl:param name="HideLeafImages">no</xsl:param><xsl:param name="ShowGridLines">no</xsl:param><xsl:param name="ShowCheckBox">no</xsl:param><xsl:param name="uniqueidprefix">uidp</xsl:param><xsl:param name="HideTitles">no</xsl:param><xsl:template match="/"><root><xsl:apply-templates select="*" /></root></xsl:template><xsl:template match="/Tree"><xsl:apply-templates select="*" /></xsl:template><xsl:template match="TreeNode"><div type="leaf"><xsl:attribute name="class">clsItem <xsl:value-of select="@class" /></xsl:attribute><xsl:attribute name="NodeId"><xsl:value-of select="@NodeId" /></xsl:attribute><xsl:attribute name="NodeChecked"><xsl:value-of select="@NodeChecked" /></xsl:attribute><xsl:attribute name="id"><xsl:value-of select="concat(generate-id(),$uniqueidprefix)" /></xsl:attribute><span class="clsLeaf" type="toggle"><span>&#160;</span></span><xsl:if test="$ShowCheckBox=\'yes\'"><xsl:choose><xsl:when test="@NodeChecked=\'yes\'"><span class="checked" type="checkbox" >a</span></xsl:when><xsl:otherwise><span type="checkbox" class="unchecked">a</span></xsl:otherwise></xsl:choose></xsl:if><span class="clsNodeImage" src="{@NodeImgSrc}"><xsl:if test="$HideLeafImages=\'yes\'"><xsl:attribute name="style">display:none;</xsl:attribute></xsl:if><xsl:if test="$HideLeafImages=\'yes\'"><span>none</span></xsl:if><xsl:if test="$HideLeafImages!=\'yes\'"><xsl:variable name="nodeImgSrc"><xsl:call-template name="getImageSrc"><xsl:with-param name="TreeNode" select="."/></xsl:call-template></xsl:variable><span type="img" class="nodeimg" style="{concat(\'background-image:url(\', $nodeImgSrc , \')\')}">&#160;</span></xsl:if></span><span class="clsLabel clsleaflabel" type="label"><xsl:attribute name="id">label_<xsl:value-of select="@NodeId" /></xsl:attribute><xsl:attribute name="title"><xsl:if test="$HideTitles=\'no\'"><xsl:value-of select="@Title" /></xsl:if></xsl:attribute><xsl:choose><xsl:when test="@Href"><a><xsl:choose><xsl:when test="@Target"><xsl:attribute name="target"><xsl:value-of select="@Target" /></xsl:attribute></xsl:when><xsl:otherwise><xsl:attribute name="target">fraContent</xsl:attribute></xsl:otherwise></xsl:choose><xsl:attribute name="tabindex">-1</xsl:attribute><xsl:attribute name="href"><xsl:value-of select="@Href" /></xsl:attribute><xsl:value-of select="@Title" /></a></xsl:when><xsl:otherwise><xsl:value-of select="@Title" /></xsl:otherwise></xsl:choose></span><xsl:copy-of select="xml" /></div></xsl:template><xsl:template match="TreeNode[.//TreeNode or @NodeXmlSrc or @type=\'dummyparent\']"><div><xsl:attribute name="class">clsItem clsparent <xsl:value-of select="@class" /></xsl:attribute><xsl:attribute name="type">parent<xsl:value-of select="@type" /></xsl:attribute><xsl:attribute name="state"><xsl:choose><xsl:when test="@expanded=\'yes\'">shown</xsl:when><xsl:otherwise>hidden</xsl:otherwise></xsl:choose></xsl:attribute><xsl:attribute name="NodeId"><xsl:value-of select="@NodeId" /></xsl:attribute><xsl:if test="count(.//TreeNode[@NodeChecked=\'yes\'])>0 or (@type=\'dummyparent\' and @NodeChecked=\'yes\')"><xsl:attribute name="NodeChecked">yes</xsl:attribute></xsl:if><xsl:attribute name="id"><xsl:value-of select="concat(generate-id(),$uniqueidprefix)" /></xsl:attribute><span class="clsCollapse clsparent clsCollapseParent" type="toggle"><xsl:choose><xsl:when test="@expanded= \'yes\'"><span class="deeptree_collapseImage">&#160;</span></xsl:when><xsl:otherwise><span class="deeptree_expandImage">&#160;</span></xsl:otherwise></xsl:choose></span><xsl:if test="$ShowCheckBox=\'yes\'"><xsl:choose><xsl:when test="count(.//TreeNode[@NodeChecked=\'yes\'] )>0 or (@type=\'dummyparent\' and @NodeChecked=\'yes\')"><xsl:choose><xsl:when test="(count(.//TreeNode[count(.//TreeNode)=0 and @NodeChecked=\'yes\']) = count(.//TreeNode[count(.//TreeNode)=0])) or (@type=\'dummyparent\' and @NodeChecked=\'yes\')"><span class="checked" type="checkbox" >a</span></xsl:when><xsl:otherwise><span class="partchecked" type="checkbox" >a</span></xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise><span class="unchecked" type="checkbox" >a</span></xsl:otherwise></xsl:choose></xsl:if><span src="{@NodeImgSrc}" class="clsParentNodeImage clsparent"><xsl:attribute name="style"><xsl:if test="$HideParentImages=\'yes\'">display:none;</xsl:if></xsl:attribute><xsl:if test="$HideParentImages=\'yes\'"><span>test</span></xsl:if><xsl:if test="$HideParentImages!=\'yes\'"><xsl:variable name="nodeImgSrc"><xsl:call-template name="getImageSrc"><xsl:with-param name="TreeNode" select="."/></xsl:call-template></xsl:variable><span type="img" class="parentImage" style="{concat(\'background-image:url(\', $nodeImgSrc , \')\')}">&#160;</span></xsl:if></span><span class="clsLabel clsparentlabel clsparentlabelFilter" type="label"><xsl:attribute name="xmlsrc"><xsl:value-of select="@NodeXmlSrc" /></xsl:attribute><xsl:attribute name="id">label_<xsl:value-of select="@NodeId" /></xsl:attribute><xsl:attribute name="title"><xsl:if test="$HideTitles=\'no\'"><xsl:value-of select="@Title" /></xsl:if></xsl:attribute><xsl:choose><xsl:when test="@Href"><a><xsl:choose><xsl:when test="@Target"><xsl:attribute name="target"><xsl:value-of select="@Target" /></xsl:attribute></xsl:when><xsl:otherwise><xsl:attribute name="target">fraContent</xsl:attribute></xsl:otherwise></xsl:choose><xsl:attribute name="tabindex">-1</xsl:attribute><xsl:attribute name="href"><xsl:value-of select="@Href" /></xsl:attribute><xsl:value-of select="@Title" /></a></xsl:when><xsl:otherwise><xsl:value-of select="@Title" /></xsl:otherwise></xsl:choose></span><xsl:choose><xsl:when test="@expanded=\'yes\'"><div class="clscontainer shown" type="container"><xsl:apply-templates select="./TreeNode" /> <span></span></div></xsl:when><xsl:otherwise><div class="clscontainer hide" type="container"><xsl:apply-templates select="./TreeNode" /><span></span> </div></xsl:otherwise></xsl:choose><xsl:copy-of select="xml" /></div></xsl:template><xsl:template match="@Target"><xsl:copy><xsl:value-of select="." /></xsl:copy></xsl:template><xsl:template match="/TreeNode"> <!--xsl:apply-templates select="*"/--></xsl:template><xsl:template match="TreeNode/Tree"><xsl:apply-templates select="*" /></xsl:template><xsl:template match="deeptreeconfig"></xsl:template><xsl:template name="getImageSrc"><xsl:param name="TreeNode"/><xsl:variable name="nodeType"><xsl:choose><xsl:when test="$TreeNode/xml/node/type"><xsl:choose><xsl:when test="$TreeNode/xml/node/type and $TreeNode/xml/node/document/record/type"><xsl:value-of select="concat($TreeNode/xml/node/type,\'.\',$TreeNode/xml/node/document/record/type)"/></xsl:when><xsl:otherwise><xsl:value-of select="$TreeNode/xml/node/type"/></xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise><xsl:value-of select="$TreeNode/xml/document/record/type"/></xsl:otherwise></xsl:choose></xsl:variable><xsl:choose><xsl:when test="count(/Tree/deeptreeconfig/TypeImages/record[type = $nodeType])&gt;0"><xsl:value-of select="concat($pathPrefix,/Tree/deeptreeconfig/TypeImages/record[type = $nodeType]/image)"/></xsl:when><xsl:when test="string-length($TreeNode/@NodeImgSrc)&gt;0"><xsl:value-of select="concat($pathPrefix,$TreeNode/@NodeImgSrc)"/></xsl:when><xsl:otherwise><xsl:choose><xsl:when test="$TreeNode[.//TreeNode or @NodeXmlSrc or @type=\'dummyparent\']"><xsl:value-of select="$defaultparentimage"/></xsl:when><xsl:otherwise><xsl:value-of select="$defaultleafimage"/></xsl:otherwise></xsl:choose></xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>');


    var m_objStateXSLDoc = objXMLDocTreeTemplate.cloneNode(true);
    m_objStateXSLDoc.async = false;
    m_objStateXSLDoc.loadXML('<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="xml" omit-xml-declaration="yes"/><xsl:template match="/root"><root><xsl:choose><xsl:when test="count(div[@type=\'container\'])=1"><xsl:apply-templates  select="div/div"/></xsl:when><xsl:otherwise><xsl:apply-templates  select="div"/></xsl:otherwise></xsl:choose></root></xsl:template><xsl:template match="div"><TreeNode><xsl:attribute name="Id"><xsl:value-of select="@id"/></xsl:attribute><xsl:if test="string-length(@NodeId)>0"><xsl:attribute name="NodeId"><xsl:value-of select="@NodeId"/></xsl:attribute></xsl:if><xsl:if test="string-length(span/img[@type=\'img\']/@originalsrc)>0"><xsl:attribute name="NodeImgSrc"><xsl:value-of select="span/img[@type=\'img\']/@originalsrc"/></xsl:attribute></xsl:if><xsl:if test="string-length(@NodeChecked)>0"><xsl:attribute name="NodeChecked"><xsl:value-of select="@NodeChecked"/></xsl:attribute></xsl:if><xsl:attribute name="Title"><xsl:value-of select="span[@type=\'label\']"/></xsl:attribute><xsl:apply-templates  select="div[@type=\'container\']/div"/><xsl:copy-of select="xml"/></TreeNode></xsl:template></xsl:stylesheet>');

    var m_iMaxCalls = 1024;
    var m_aoCalls   = new Array();
    var m_iLastCall = 0;
    var m_iMasterIdx = null;
    var m_bSyncFailed = false;

    var sMeta = "";

    var m_sTempNodeStart = "<div class='clsTreespan clsItem' type='parent'><span class='clsTreespan ' type='img'><span class='clsLeaf'></span></span><span class='clsTreespan clsLabel' type='label'><span class='clsUnavailable'>";
    var m_sTempNodeEnd = "</span></span></div>";

    var m_sUnavailableText = "Unavailable";
    var m_sLoadingText = "Loading...";
    var bGradientInitialised = false
    var m_sConfigXML=""

    
    function SetConfigXML(sValue)
    {
	    m_sConfigXML = sValue
    }

    var m_objConfig = {};
    ///<summary>
    ///Initialises all global variables that will be accessed in the course of the page.
    ///</summary>
    function initializeEnvironment(strCfgXMLSrc)
    {
        m_objConfig = new Config(strCfgXMLSrc);
    }

    //rv ff
    function GetNodeObjectById(sID)
    {
	    var objLI = GetNodeById(sID)
	    if(objLI==null)
		    return null
	    return getNodeObject(objLI)
    }

    ///<summary>Private function that returns the nodeobject for the currently selected div.</summary>
    /// <seealso cref="node"></seealso>	
    function getNodeObject(objLI)
    {
	    var objNode
	    try
	    {
	        if(objLI != null)
	        {
	            objNode = new node(objLI)
            }
	    }
	    catch(e)
	    {
	        objNode = null
        }
        return objNode
    }

    /// <seealso cref="fireNodeChecked"></seealso>	
    /// <seealso cref="SelectNode"></seealso>	
    function node(objLI)
    {
	    var me_objLI = objLI
	    this.HTMLobj = me_objLI 
	    this.nodeChecked = "no"
        this.id = me_objLI.id
        this.nodeId = me_objLI.getAttribute("NodeId")
        this.nodeImgSrc = me_objLI.getAttribute("NodeImgSrc")
        this.nodeChecked = me_objLI.getAttribute("NodeChecked")
        this.type = me_objLI.type
        this.getTitle = function() {return GetTitle(me_objLI)};
        this.getTitleElement = function() {return GetTitleElement(me_objLI)};
	    this.setXMLElement = function() {SetNodeXMLElement(arguments[0])};
        this.getXMLElement = function (){return GetXMLNodeElement(me_objLI)};
        this.getParentNode = function (){return getNodeObject(GetParent(me_objLI))};
        this.firstChild = function (){return getNodeObject(GetFirstChild(me_objLI))};
        this.lastChild = function (){return getNodeObject(GetLastChild(me_objLI))};
        this.previousSibling = function(){return  getNodeObject(GetPreviousSibling(me_objLI))};
        this.nextSibling = function(){return  getNodeObject(GetNextSibling(me_objLI))};
    }

    var m_strDate= getSpeedDate()

    //-----------------------------------------------
    // GetXML(strXMLSrc, strXSLsrc)
    //-----------------------------------------------
    function GetXML( strXMLSrc , oContainer , oElClass , oSync ,bASync)
    {
	    var aryXMLNodes;
        var i = 0;
        var strRetVal = "";
        
                
        if (fireNodeXmlSrc(oContainer,oElClass)) return;
        
        var iCall       = fnAllocCall();
        var objXMLDoc   = objXMLDocTreeTemplate.cloneNode(true) 
        objXMLDoc.async = bASync;

        
        m_aoCalls[iCall] = new CallObject( objXMLDoc , oContainer , oElClass , oSync, strXMLSrc, iCall );
    	
        return iCall;
    }

    function fireNodeXmlSrc(oEl,oElClass)
    {
	    var evt = new Object();
	    evt.type            = "onLoadNodeXmlSrc";
	    evt.NodeXMLElement  = GetXMLElement(oEl.parentNode);
	    evt.node            = getNodeObject(oEl.parentNode);
	    
	    me.raiseEvent("onloadnodexmlsrc",evt);
	    
	    if(evt.nodeXmlSrc!=null)
	    {
	        var objXMLDoc = objXMLDocTreeTemplate.cloneNode(true) 
		    objXMLDoc.loadXML(evt.nodeXmlSrc);	
    		
    		
		    if (m_objXSLDoc.xml != "")
		    {
			    m_objXSLDoc.selectSingleNode("//xsl:param[@name='uniqueidprefix']").text = thisElement.id;
    			
			    var sHtml = transformNode(objXMLDoc)//.transformNode(m_objXSLDoc);
                
			    //update memory xml
			    alterTreeState(sHtml,oEl.parentNode.id)
			    sHtml =  fixHTML(sHtml)
		        oEl.innerHTML = sHtml;
                oEl.className = oElClass;
			    return true
		    }
	    }
	    return false;
    }
    //-------------------------------------------------------------------------------------------------
    //                                     EVENT HANDLERS
    //-------------------------------------------------------------------------------------------------

    //-----------------------------------------------
    // Init()	
    //-----------------------------------------------
    function Init()
    {
	      
        var strHTML;
        var objLI;
       
        
       
	    initializeEnvironment();

	    thisElement.setAttribute("type","container");
    	
        m_iMasterIdx = GetXML( m_objConfig.TopXMLSrc , thisElement , "deeptree" ,true);
        
    //    alert(thisElement.id)
	    //window.document.body.insertAdjacentHTML("beforeEnd","<t:TRANSITIONFILTER BEGIN='oDiv1.begin' TYPE='fade' DUR='1' id='tran2' /><span id='Timer' class='time' dur='.01' repeatCount='indefinite' />");
    	
    }

    //-----------------------------------------------
    // Double Click()
    //-----------------------------------------------

    function DblClick()
    {
	    //Click()
        var evt = new Object();
        evt.type = "nodedblclick"
        evt.node = getNodeObject(objLI_Current)
        me.raiseEvent("onnodedblclick", evt)
    }

    function fireOnLoad()
    {
        var evt = new Object();
        evt.type = "onload"
        me.raiseEvent("onload", evt)
    }
    
    function fireOnLoadAsync()
    {
        var evt = new Object();
        evt.type = "onloadasync"
        me.raiseEvent("onloadasync", evt)
    }


    function BeforeSelect()
    {
        var evt = new Object();
        evt.type = "onbeforeselect"
        me.raiseEvent("onBeforeSelect", evt)
    }

    function nodebeforeselect()
    {

    }

    function checkboxState(objLI, objColor)
    {
    	
	    objLI.style.color = objColor.toLowerCase()
	    objLI.style.backgroundColor="white"
	    if( objColor.toLowerCase()=="red" )
	    {
		    objLI.parentNode.setAttribute("NodeChecked","yes");
        }
	    else
	    {
		    objLI.parentNode.setAttribute("NodeChecked","no");
        }
    	
    //	m_objStateXML.selectSingleNode("//div[@id='" + objLI.parentNode.id + "']").setAttribute("NodeChecked",objLI.parentNode.getAttribute("NodeChecked"))	
	    var treeNode = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='" + objLI.parentNode.id + "']")
	    
	    if(treeNode != null)
	    {
	        treeNode.setAttribute("NodeChecked",objLI.parentNode.getAttribute("NodeChecked"))	
        }

	    if (arguments.length>2)
	    {
		    if(arguments[2]==true && objLI.style.color=="red")
		    {
			    objLI.style.backgroundColor = "silver";
            }
	    }
    }


    function fireNodeChecked(objLI)
    {
    	
	    var evt = new Object()
        evt.type = "onnodechecked"
        evt.node = getNodeObject(objLI)
        me.raiseEvent("onnodechecked", evt)
	    
	    if(evt.cancel==true)
	    {
		    return false
		}    
	    return true	
    }

    function fireBeforeNodeChecked(objLI)
    {
	    var evt = new Object();
        evt.type = "beforenodechecked";
        evt.node = getNodeObject(objLI);
        me.raiseEvent("onbeforenodechecked");
        
	    if(evt.cancel == true)
	    {
		    return false;
        }
	    return true	
    }

    function releaseContext()
    {
	    if (m_objContextSelection==null || m_objContextSelection==objLI_Current )
		    return 
	    HighlightNode (m_objContextSelection)
	    m_objContextSelection==null
	    return true;
    }

    function rightClick(evt)
    {
        if(evt == null) evt = window.event
    
	    var objUnknown;
	    var objLI;
	    
	    objUnknown = top.DHTMLLib.getEventSrcElement(evt);
	    m_objContextSelection = objLI_Current;

        top.DHTMLLib.preventDefault(evt);
        evt.cancelBubble = true;
        
 	    if( objUnknown.tagName.toUpperCase() == "A" )
	    {  
		    objLI = objUnknown.parentNode.parentNode;
        }
        else if( null != objUnknown.parentNode && objUnknown.getAttribute("type") == "toggle" )
        {
    	    objLI = objUnknown.parentNode.parentNode;
        }
        else if( objUnknown.getAttribute("type") == "img" )
        {
		    objLI = objUnknown.parentNode;
	    }
	    else if( objUnknown.getAttribute("type") == "label" )
	    {
		    objLI = objUnknown.parentNode;
	    }
	    
	    
	    if(objLI == null) 
	    {
	        return true
        }
        
	    HighlightNode(objLI)
	    
	    if(fireRightClick(objLI, evt)==false) 
	    {
	        return true;
        }
        
	    releaseContext()
	    return true;
    }

    function fireRightClick(objLI, evt)
    {
    
        var e       = new Object();
        e.screenX   = evt.screenX;
        e.screenY   = evt.screenY;
        e.clientX   = evt.clientX;
        e.clientY   = evt.clientY;
        e.pageX     = evt.pageX;
        e.pageY     = evt.pageY;
        e.type      = "rightclick";
        e.node      = getNodeObject(objLI);
        
        me.raiseEvent("onrightclick", e);
	    return e.releaseContext;
    }

    //rv - ff
    function Click(evt)
    {
	    if(m_bSlidingNow == true) return;
	    var objUnknown;
	    var objLI;
	    
	    objUnknown = top.DHTMLLib.getEventSrcElement(evt)

        top.DHTMLLib.preventDefault(evt)
	    evt.cancelBubble = true;

	    var sHandledTypes = "checkbox,leaf,img,label";
	    var sHandledParentTypes = "toggle";
	    
	    var type, nodeElement;
	    for(var i=0 ; i < 5 ; i++)
	    {
		    if(objUnknown == null || objUnknown.tagName == null) return;
		    
		    type = objUnknown.getAttribute("type");
		    if (sHandledTypes.indexOf(type) >= 0 )
		    {
			    break;
			}
			
		    if (objUnknown.parentNode != null && sHandledParentTypes.indexOf(type) >= 0 )
		    {
			    break;
			}
			
		    objUnknown = objUnknown.parentNode;
	    }
	    
	    nodeElement = objUnknown;
	    for(var i = 0 ; i < 5 && nodeElement != null ; i++)
	    {
	        try{if(nodeElement.getAttribute("type") == "leaf" || nodeElement.getAttribute("type") == "parent" || nodeElement.getAttribute("type") == "parentdummyparent") break;
	        nodeElement = nodeElement.parentNode;}
	        catch(e){nodeElement = null;break}
	    }

	    if(objUnknown == null || nodeElement == null) return;

 	    if(objUnknown.tagName.toUpperCase() == "A" )
	    {  
		    objLI = objUnknown.parentNode.parentNode;
		    
		    BeforeSelect();
		    SelectNode(objLI, false, false);
    		
		    ToggleNode(objLI);
        }
        else if (type == "checkbox")
        {
		    if(	fireBeforeNodeChecked(objUnknown.parentNode)!=false)
		    {
			    if(objUnknown.parentNode.getAttribute("NodeChecked")=="yes" )
				    objUnknown.style.color = "white"
			    else
				    objUnknown.style.color = "red" 	
			    checkSelectedNodeChildren(objUnknown.parentNode, objUnknown.style.color )
			    checkSelectedNodeSiblings(objUnknown.parentNode, objUnknown.style.backgroundColor )
			    fireNodeChecked(objUnknown.parentNode)
		    }		
        }
        else if( null != objUnknown.parentNode && type == "toggle" || type == "img")
        {
       	    objLI = nodeElement;

		    if ( objLI.getAttribute("type") == "leaf" )
		    {
			    BeforeSelect();
			    SelectNode( objLI, false, false );
		    }
		    else
		    {
			    ToggleNode(objLI);
		    }
        }
	    else if( type == "label" )
	    {
		    objLI = nodeElement;
		    
		    BeforeSelect();
		    
		    SelectNode(objLI, false, false );
		    
		    if(m_objConfig.ToggleOnSelect != "no")
		    {
		        ToggleNode(objLI);
		    }
	    }
	    return false;
    }

    //-----------------------------------------------
    // KeyDown()
    //-----------------------------------------------

    function KeyDown(evt)
    {
        
      var blnRetVal = false
      var objLI;
      
      //alert(evt)

      if (window.event.ctrlKey == false && window.event.altKey == false)
        {

        window.event.cancelBubble = true;
        window.event.returnValue = false;

        switch (window.event.keyCode)
          {

          case 9 : // tab key
		    return
            if (window.event.shiftKey == true)
              {
              MovePrevious();
              }
            else
              {
              MoveNext();
              }
            break;

          case 13 : // enter key
            objLI = window.event.srcElement.parentNode;
            LoadNodeContent(objLI);
            break;

          case 37 : // left key
            MoveLeft()
            break;

          case 38 : // up key
            MoveUp()
            break;

          case 39 : // right key
            MoveRight()
            break;

          case 40 : // down key
            MoveDown()
            break;
              
          case 188 : // "<" key
            MovePrevious();
            break;

          case 190 : // ">" key
            MoveNext();
            break;

          default :
            window.event.cancelBubble = false;
            window.event.returnValue = true;
            blnRetVal = true;
            break;
          }
        }
      else
        {
        window.event.cancelBubble = false;
        window.event.returnValue = true;
        blnRetVal = true;
        }
          
      return blnRetVal;
      }

    function MouseDown()
    {
    /*	var objUnknown;

	    objUnknown = window.event.srcElement;
	    if (objUnknown.tagName.toUpperCase() == "A")
	    {
		    objUnknown = objUnknown.parentNode;
	    }

	    if (objUnknown.type == "label")
	    {
		    top.DHTMLLib.addClass(objUnknown,'clsMouseDown');
    		
	    }
    	
    	
	    return true;
    */
    }

    //rv - ff
    function MouseOut(evt)
    {
	    var objUnknown;
	    var objLI;
	    var i = 0;

	    objUnknown = top.DHTMLLib.getEventSrcElement(evt);

	    for(var i = 0 ; i < 20 ; i++)
	    {
		    if(objUnknown==null || objUnknown.tagName == null) return;
		    if (objUnknown.getAttribute("type") == "label")
		    {
			    break
			}
		    objUnknown = objUnknown.parentNode;
	    }

	    try{
	    if (objUnknown.getAttribute("type") == "label" )
	    {
		    top.DHTMLLib.removeClass(objUnknown,"clsMouseOver")
	    }
	    }catch(e){}
	    return true;
    }

    //rv - ff
    function MouseOver(evt)
    {

	    var objUnknown;
	    var strStatus;
	    var bFireEvent= false;

	    objUnknown = top.DHTMLLib.getEventSrcElement(evt)
	    
	    for(var i = 0 ; i < 5 ; i++)
	    {
		    if(objUnknown==null || objUnknown.tagName == null ) return;
		    
		    if (objUnknown.getAttribute("type") == "label")
		    {
			    break;
            }
		    objUnknown = objUnknown.parentNode;
	    }

	    try{
		    if (objUnknown.getAttribute("type") == "label")
		    {
			    top.DHTMLLib.addClass(objUnknown,"clsMouseOver")
			    bFireEvent = true
		    }
    		
    		
		    if (bFireEvent)
		    {
			    var evt = new Object();
			    evt.type = "nodemouseover";
			    objUnknown = objUnknown.parentNode;
			    evt.def = GetXMLElement (objUnknown);
			    me.raiseEvent("nodemouseover", evt)
		    }
	    }catch(e){}
	    return true;
    }

    
    function SetNodeXMLSrc(sNodeXMLSource)
    {
	    var objXMLDoc = objXMLDocTreeTemplate.cloneNode(true) 
	    objXMLDoc.loadXML (sNodeXMLSource);	
        if (objXMLDoc.xml == "")
        {
		    objXMLDoc.async = false
		    objXMLDoc.load (sNodeXMLSource);	    
	    }
        if (objXMLDoc.xml != "")
        {
            
		    m_objXSLDoc.selectSingleNode("//xsl:param[@name='uniqueidprefix']").text = thisElement.id
            var sHtml = transformNode(objXMLDoc)//.transformNode( m_objXSLDoc );
            
		    if(sHtml.length == 0)
		    {
		        return
		    }
		    sHtml =  fixHTML(sHtml)
        } 

	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );

	    if( null == objLI_Current ) return;
	    
	    var objUL = GetHtmlElement(objLI_Current,"DIV","container");
	    
	    if (null==objUL)
	    {
		    if (objLI_Current.getAttribute("type")=="leaf") 
		    {
			    objLI_Current.setAttribute("type","parent");
			    
			    sHtml = sNewParentStartTag + sHtml + sNewParentEndTag 
			    var collapseNode = top.XMLLib.getNodeFirstChild(objLI_Current);
			    var imgNode      = top.XMLLib.getNodeNextSibling(collapseNode);
			    
			    collapseNode.className = "clsCollapse";
			    
			    var objIMG = GetHtmlElement(imgNode, "IMG")
			    
			    if (objIMG.getAttribute("originalsrc") == null)
			    {
				    objIMG.src = DefaultParentImage;
			    }
			    
			    objUL = objLI_Current
		    }
	    }
	    objUL.insertAdjacentHTML ("beforeEnd",sHtml)	

	    //code to update the nodeXML
	    //var oContainer = m_objStateXML.selectSingleNode("//div[@id='"  + objLI_Current.id + "']/div[@type='container']")
	    var oContainer = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + objLI_Current.id + "']")
    //	if(oContainer == null)
    //		oContainer = m_objStateXML.selectSingleNode("//div[@id='"  + objLI_Current.id + "']")
	    var oNewNodeXML = objXMLDocTreeTemplate.cloneNode(true)
	    oNewNodeXML.loadXML ("<root>" + sHtml +"</root>")
	    var sTransformedXML = oNewNodeXML.transformNode(m_objStateXSLDoc)
    	
	    oNewNodeXML.loadXML("<root>" + sTransformedXML + "</root>")
	    oContainer.appendChild(oNewNodeXML.selectSingleNode("/root").childNodes[0])
	    //************************
    	
	    ExpandNode(objLI_Current)
    }

    //rv ff
    function setNodeXMLbyNodeId(sXML,sNodeId)
    {
    	
	    var objLI
	    if(sNodeId!=null)
	    {
		    objLI = GetNodeById(sNodeId)
	    }
	    
	    if(objLI == null)
	    {
		    SetNodeXMLElement(sXML)
		}
	    else
	    {
		    setNodeXMLInternal(sXML,objLI)	
        }
    }

    //rv ff
    function setNodeXMLInternal(sXML,objLI)
    {
	    var objXML = GetXMLElement(objLI);
	    
	    if(sXML.indexOf("<xml>") == 0)
	    {   
	        sXML = sXML.substring(5,sXML.lastIndexOf("</xml>"))
	    }

	    if(objXML != null)
	    {
		    objLI.removeChild(objXML);
        }
	    
	    //code to update the nodeXML
	    //var oContainer = m_objStateXML.selectSingleNode("//div[@id='"  + objLI.id + "']")
	    var oContainer = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + objLI.id + "']");
	    var oXMLData = oContainer.selectSingleNode("xml");
	    
	    if(oXMLData != null)
	    {
		    oContainer.removeChild(oXMLData);
	    }
	    var oNewNodeXML = objXMLDocTreeTemplate.cloneNode(true);
	    oNewNodeXML.loadXML ("<root><xml>" + sXML + "</xml></root>");
	    
	    oContainer.appendChild(oNewNodeXML.selectSingleNode("/root").childNodes[0]);
	    //*****
	    //objLI.insertAdjacentHTML ("beforeend","<xml>" + sXML + "</xml>")
	    objLI.insertAdjacentHTML ("beforeend","<xml>" + sXML + "</xml>");
	    
    }

    function SetNodeXMLElement(sXML)
    {
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
	    if( null == objLI_Current ) return;
	    setNodeXMLInternal(sXML,objLI_Current)
    }

    function GetNodeXMLElement()
    {
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
	    if( null == objLI_Current ) return;
	    return (GetXMLElement(objLI_Current));
    }

    function copyNode(sId)
    {
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    if( null == objLI_Current ) return;
	    var sTreeState = getState()
	    var m_objTree = objXMLDocTreeTemplate.cloneNode(true)
	    m_objTree.loadXML(sTreeState)
	    var sNodeId = sId
	    
	    if(sNodeId==null)
	    {
		    sNodeId = GetId()
    	}
    		
	    var objCopyXML = m_objTree.selectSingleNode("//TreeNode[@Id='" + sNodeId + "']");
	    var objCopyNodeXML = objXMLDocTreeTemplate.cloneNode(true)
	    objCopyNodeXML.loadXML(objCopyXML.xml)
	    m_nodeClipboard = objCopyNodeXML;
        
	    return m_nodeClipboard;
    }

    function pasteTreeNode()
    {
    	
	    if( null == objLI_Current ) 
	    {
	        objLI_Current = GetHtmlElement( thisElement , "div" );
        }
	    
	    if( null == objLI_Current ) 
	    {
	        return;
        }
        
	    var sOriginalClip = m_nodeClipboard.xml
	    
	    var evt = new Object()
	    evt.type="beforePaste"
	    evt.nodeXML = m_nodeClipboard.xml;
	    me.raiseEvent("onbeforepaste", evt);
	    
	    
	    if (evt.returnValue != null)
	    {
		    m_nodeClipboard.loadXML(evt.returnValue)
        }
        
	    var objXMLDoc = objXMLDocTreeTemplate.cloneNode(true) 
	    objXMLDoc.loadXML ("<Tree>" + m_nodeClipboard.xml + "</Tree>");	
    	
        if (m_objXSLDoc.xml != "")
        {
		    m_objXSLDoc.selectSingleNode("//xsl:param[@name='uniqueidprefix']").text = thisElement.id;
		    var sHtml = transformNode(objXMLDoc)//.transformNode( m_objXSLDoc );
    		
		    if(sHtml.length > 0)
		    {
			    alterTreeState(sHtml,objLI_Current.id);
			    sHtml =  fixHTML(sHtml);
			    var objLastChild = GetLastChild(objLI_Current);
		        objLastChild.insertAdjacentHTML("afterend", sHtml);
		        objLastChild = GetLastChild(objLI_Current);
		        SelectNode(objLastChild);
		    }
        }
        
        m_nodeClipboard.loadXML (sOriginalClip);
    }

    function beforePaste()
    {
	    //alert("before paste")
    }

    function cutNode()
    {
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    if( null == objLI_Current ) return;
	    m_nodeClipboard = objLI_Current.outerHTML;
	    var objMemClipboard = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='" + sNodeId +"']")
	    objMemClipboard.parentNode.removeChild(objMemClipboard)
	    var sNodeId = GetId()
	    RemoveTreeNode(sNodeId)
	    return m_nodeClipboard;
    }

    function moveNodeDown(sNodeId, spanParent)
    {
	    moveNode("down", sNodeId, spanParent)
    }

    function moveNode(sDirection,sNodeId, spanParent)
    {
    	
	    var objLI
	    if(sNodeId != null)
	    {
		    objLI = GetNodeById(sNodeId);
		}
	    else
	    {
		    if( null == objLI_Current ) 
		    {
			    objLI = GetHtmlElement( thisElement , "div" );	
			}
		    else
		    {
			    objLI = objLI_Current;
			}
    //		objLI_Current = GetHtmlElement( thisElement , "div" );	
	    }
	    
	    
	    var objLI_New;
    	
	    var objLI_Parent  = objLI.parentNode;
	    
	    if(sDirection == "up")
	    {
	        objLI_New = GetPreviousSibling(objLI);
            
		    if(objLI_New == null && spanParent == true)
		    {
		        objLI_Parent = getChildContainer(objLI_Parent.parentNode.previousSibling);
		        objLI_New = GetLastChild(objLI_Parent.parentNode);
		    }

            objLI_Parent.insertBefore(objLI, objLI_New);
		    
	    }
	    else
	    {
	      
		    objLI_New = GetNextSibling(objLI);
		    if(objLI_New != null && objLI_New.nodeName == "xml")
		    {
		        objLI_New = GetNextSibling(objLI_New);
		    }

		    if (objLI_New == null) {

		        if (spanParent == true) {
		            objLI_Parent = getChildContainer(objLI_Parent.parentNode.nextSibling);
		            objLI_New = GetFirstChild(objLI_Parent.parentNode);
		        }
		        else {
		            objLI_New = GetFirstChild(objLI_Parent.parentNode);
		        }
		    }
		    else {
		        objLI_New = GetNextSibling(objLI_New);
            }
	        objLI_Parent.insertBefore(objLI, objLI_New);
    	    
	    }

	    //change the state
	    //var objLI_Crnt = m_objStateXML.selectSingleNode("//div[@id='"  + objLI_Current.id + "']")
	    
	    var objLI_Crnt = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + objLI.id + "']")
	    var objLI_Nw 
	    var objLI_Prnt = objLI_Crnt.parentNode;
	    
	    if(sDirection=="up")
	    {
		    objLI_Nw = objLI_Crnt.previousSibling;
		    
		    if(objLI_Nw == null && spanParent == true)
		    {
		        objLI_Prnt = objLI_Prnt.previousSibling;
		    }
		    
		    if(objLI_Nw != null)
		    {
		        if(objLI_Nw.nodeName == "xml")
		        {
		            objLI_Nw = objLI_Nw.previousSibling;
		        }
		    }
		    objLI_Prnt.insertBefore(objLI_Crnt, objLI_Nw);
	    }
	    else
	    {
	        //first get the next sibling
		    objLI_Nw = objLI_Crnt.nextSibling;
		    if(objLI_Nw != null && objLI_Nw.nodeName == "xml")
		    {
		        objLI_Nw = objLI_Nw.nextSibling;
		    }
		    
		    if(objLI_Nw == null && spanParent == true)
		    {
		        objLI_Prnt = objLI_Prnt.nextSibling;
		        objLI_Nw = objLI_Prnt.firstChild
		    }
		    else
		    {
		        //get the next to next sibling if next sibling is found
		        objLI_Nw = objLI_Nw.nextSibling;
                if(objLI_Nw != null && objLI_Nw.nodeName == "xml")		        
                {
                    objLI_Nw = objLI_Nw.nextSibling;
                }
		    }
		    
		    objLI_Prnt.insertBefore(objLI_Crnt, objLI_Nw)		
	    }
    }

    function moveNodeUp(sNodeId, spanParent)
    {
	    moveNode("up", sNodeId, spanParent)
    }

    //rv ff
    function GetXMLElement(objUnknown)
    {
	    var i;
	    for(i = objUnknown.childNodes.length-1 ; i >= 0; i--)
	    {
		    if (objUnknown.childNodes[i].tagName!= null && objUnknown.childNodes[i].tagName.toLowerCase() == "xml" )
		    {
			    return(objUnknown.childNodes[i])
		    }
	    }
	    
	    return null
    }
    
    function GetXMLNodeElement(objUnknown)
    {
        try
        {
            return m_objTreeNodeState.selectSingleNode("//TreeNode[@Id = '" + objUnknown.id + "']/xml");
	    }
	    catch(e)
	    {
	        return null
        }
    }

    //-----------------------------------------------
    // MouseUp()
    //-----------------------------------------------

    function MouseUp()
    {

	    var objUnknown;
	    var objLI;
	    var i = 0;

	    objUnknown = window.event.srcElement;

	    if (objUnknown.tagName.toUpperCase() == "A")
	    {
		    objUnknown = objUnknown.parentNode;
	    }

	    if (objUnknown.type == "label")
	    {
		    top.DHTMLLib.removeClass(objUnknown,"clsMouseDown")
		    top.DHTMLLib.addClass(objUnknown,"clsMouseOver")
	    }
	    return true;
    }

    //-----------------------------------------------
    // SelectStart()
    //-----------------------------------------------

    function SelectStart()
    {
	    window.event.cancelBubble = true;
	    window.event.returnValue = false;
	    return false;
    }

    //-------------------------------------------------------------------------------------------------
    //                                     PUBLIC METHODS
    //-------------------------------------------------------------------------------------------------

    //-----------------------------------------------
    // MoveNext()
    //-----------------------------------------------

    function MoveNext()
    {
	    var objLI_Temp;
	    var objLI_New;
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    if( null == objLI_Current ) return;
    	
	    if ( objLI_Current.state == "shown")
	    {
		    objLI_New = GetFirstChild(objLI_Current);
		    if (objLI_New != null)
		    {
			    SelectNode(objLI_New, false, true);
		    }
	    }
	    else
	    {
		    if (objLI_Current.type != "leaf" )
		    {
			    var bLoad = ExpandNode(objLI_Current);
			    if( bLoad )
			    {
				    objLI_Current.selectChild = true;
			    }
			    else
			    {
				    objLI_New = GetFirstChild(objLI_Current);
				    if (objLI_New != null)
				    {
					    SelectNode(objLI_New, false, true);
				    }
			    }		
		    }
		    else
		    {
			    objLI_Temp = objLI_Current;
			    objLI_New = GetNextSibling(objLI_Temp);
			    while (objLI_New == null)
			    {
				    objLI_Temp = GetParent(objLI_Temp);
				    if (objLI_Temp == null)
				    {
					    objLI_New = objLI_Current;
				    }
				    else
				    {
					    objLI_New = GetNextSibling(objLI_Temp);
				    }
			    }
			    SelectNode(objLI_New, false, true);
		    }
	    }
    }

    //-----------------------------------------------
    // MovePrevious()
    //-----------------------------------------------

    function MovePrevious()
    {
	    if( null == objLI_Current ) return;
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    var objLI_New;
	    objLI_New = GetPreviousSibling(objLI_Current);

	    if (objLI_New != null)
	    {
		    SelectNode(objLI_New, false, true);
	    }
	    else
	    {
		    objLI_New = GetParent(objLI_Current);
		    if (objLI_New != null)
		    {
			    SelectNode(objLI_New, false, true);
		    }
	    }
    }

    //-----------------------------------------------
    // MoveLeft()
    //-----------------------------------------------

    function MoveLeft()
    {
	    var objLI_New;
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    if (objLI_Current.state == "shown")
	    {
		    CollapseNode(objLI_Current);
	    }
	    else
	    {
		    objLI_New = GetParent(objLI_Current);
		    if (objLI_New != null)
		    {
			    SelectNode(objLI_New, false, true);
		    }
	    }
    }

    //-----------------------------------------------
    // MoveUp()
    //-----------------------------------------------

    function MoveUp()
    {
	    var objLI_New;
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    objLI_New = GetPreviousSibling(objLI_Current);
    	
	    if (objLI_New != null)
	    {
		    while (objLI_New.state == "shown")
		    {
			    objLI_New = GetLastChild(objLI_New);
		    }
		    SelectNode(objLI_New, false, true);
	    }
	    else
	    {
		    objLI_New = GetParent(objLI_Current);
	        if (objLI_New != null)
		    {
			    SelectNode(objLI_New, false, true);
		    }
	    }
    }

    //-----------------------------------------------
    // MoveRight()
    //-----------------------------------------------

    function MoveRight()
    {
	    var objLI_New;
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
	    if( objLI_Current.state == "shown")
	    {
		    objLI_New = GetFirstChild(objLI_Current);
		    if (objLI_New != null)
		    {
			    SelectNode(objLI_New, false, true);
		    }
	    }
	    else if( objLI_Current.type != "leaf" )
	    {
		    ExpandNode(objLI_Current);
	    }
    }

    //-----------------------------------------------
    // MoveDown()
    //-----------------------------------------------

    function MoveDown()
    {
	    var objLI_New;
	    var objLI_Temp;
    	
	    if( null == objLI_Current ) objLI_Current = GetHtmlElement( thisElement , "div" );
    	
	    if (objLI_Current.state == "shown")
	    {
		    objLI_New = GetFirstChild(objLI_Current);
		    SelectNode(objLI_New, false, true);
	    }
	    else
	    {
		    objLI_Temp = objLI_Current;
		    objLI_New = GetNextSibling(objLI_Temp);

		    while (objLI_New == null)
		    {
			    objLI_Temp = GetParent(objLI_Temp);

			    if (objLI_Temp == null)
			    {
				    objLI_New = objLI_Current;
			    }
			    else
			    {
				    objLI_New = GetNextSibling(objLI_Temp);
			    }
		    }
		    SelectNode(objLI_New, false, true);
	    }
    }

    //-----------------------------------------------
    // Sync(xml)
    //-----------------------------------------------

    function SyncAsync( oSync )
    {
        if( null != oSync.oLi )
        {
            oSync.oLastLi = oSync.oLi;
        }
        if( null == oSync.oContextList ) return false;
        var oElementId = oSync.oContextList.item( oSync.iCurrentIdx ).getAttribute( "id" );
        var oEl = window.document.all( oElementId );
        if( !oSync.bBadIds && null != oEl && "object" == typeof( oEl ) )
        {

            oSync.oLi = oEl.parentNode;
        }
        else
        {
            oSync.bBadIds = true;
            var sTitle = oSync.oContextList.item( oSync.iCurrentIdx ).getAttribute( "label" );
            oEl = GetNodeFromTitle( sTitle , oSync.oLastLi );
            if( null != oEl )
            {
                oSync.oLi = oEl.parentNode;
            }
            
        }
        oSync.iCurrentIdx++;
        if( oSync.iCurrentIdx == oSync.oContextList.length )
        {
            
            ExpandNode( oSync.oLi , null );
            SelectNode( oSync.oLi , true, true );
            
        }
        else
        {
            ExpandNode( oSync.oLi , oSync );
        }
        if( oSync.oLi == null ) return false;
        return true;
    }

    function SyncObject( oContextList )
    {
        this.oContextList = oContextList;
        this.oLi = null;
        this.oLastLi = null;
        this.bBadIds = false;
        this.iCurrentIdx = 0;
    }

    function Sync( sNodeId )
    {
        try
        {
            if( top.content.document.body.readyState != "complete" )
            {
                return;
            }
            var oContextXml = top.content.xmlPageContext;
            oContextXml = oContextXml.selectNodes( "//item[@id]" );
            var oSync = new SyncObject( oContextXml );
            if( !SyncAsync( oSync ) )
            {
                m_bSyncFailed = true;
            }

        }
        catch(e)
        {
		    m_bSyncFailed = true;
        }
    }

    //-------------------------------------------------------------------------------------------------
    //                                     PRIVATE METHODS
    //-------------------------------------------------------------------------------------------------

    function GetNodeFromTitle( sTitle , oParentEl )
    {
       
        var oList = null;
        var oNode = null;
        var oTmpNode = null;
        if( oParentEl == null )
        {
            oList = thisElement.childNodes;
        }
        else
        {
            var oList = GetChildren( oParentEl );
        }
        
        for( var i = 0; i < oList.length; i++ )
        {
            if(oList[i].nodeType == 3) continue;
            
            oTmpNode = GetHtmlElement( oList[i] , "SPAN" , "label" )
            if( null != oTmpNode && "object" == typeof( oTmpNode ) && oTmpNode.title == sTitle ) 
            {
                oNode = oTmpNode;
                break;
            }
        }
        return oNode;
    }

    //rv - ff
    function ToggleNode(objLI)
    {
	    if (objLI.getAttribute("type") == "parent")
	    {
		    if (objLI.getAttribute("state") == "shown")
		    {
			    CollapseNode(objLI);
		    }
		    else
		    {
			    ExpandNode(objLI);
		    }
	    }
    }

    //rv - ff
    function CollapseNode(objLI)
    {
	    var i = 0;
	    var objUL;
	    var objIMG;

	    objUL = GetHtmlElement(objLI,"DIV","container");

	    if (objUL != null)
	    {
		    objIMG = GetHtmlElement(objLI,"SPAN","toggle");
		    if (objUL != null)
		    {
			    objLI.setAttribute("state", "hidden");
			    top.DHTMLLib.removeClass(objUL,"shown")
			    if (objUL.filters && objUL.filters.length > 0)
			    {
				    slideClose(objUL)
			    }
			    else
			    {			
				    top.DHTMLLib.addClass(objUL,"hide")
			    }
    //			objUL.className = "hide";
			    objIMG.childNodes[0].className = "deeptree_expandImage" 
			    //objIMG.children[0].src = "/widgets/deeptree/assets/expand.gif";

			    if (IsChild(objLI_Current, objLI) == true)
			    {
				    SelectNode(objLI, false, false);
			    }
		    }
	    }
    }




    function checkSelectedNodeChildren(objLI, objColor)
    {

	    var oTmpNode, i
	    //alert(objLI.outerHTML)
	    checkboxState(GetHtmlElement( objLI , "SPAN" , "checkbox" ), objColor)
	    var aryChildren = GetChildren(objLI)
	    if (aryChildren != null)
	    {
		    for (i = 0; i < aryChildren.length; i++)
		    {
			    oTmpNode = GetHtmlElement( aryChildren[i] , "SPAN" , "checkbox" )
			    if( null != oTmpNode && "object" == typeof( oTmpNode ) ) 
			    {
				    checkSelectedNodeChildren(aryChildren[i], objColor)
			    }
		    }
	    }
    }

    function checkSelectedNodeParents(objLI, objColor,bPartial)
    {
	    var oTmpNode, i
	    var objParent = GetParent(objLI)
    	
	    if (objParent==null) return
	    //checkSelectedNodeParents(objParent, objColor,bPartial)
	    var objcheckboxSPAN = GetHtmlElement( objParent , "SPAN" , "checkbox" )
	    checkboxState(objcheckboxSPAN, objColor,bPartial)
	    checkSelectedNodeSiblings(objParent,objcheckboxSPAN.style.backgroundColor)

    }

    function checkSelectedNodeSiblings(objLI,sColor)
    {
    	
	    var oTmpNode, i,bChecked = false,bPartial = false
	    var arySiblings = GetSiblings(objLI)
	    if(sColor.toLowerCase() =="silver")
	    {
		    bPartial = true
	    }
	    if (arySiblings != null)
	    {
		    for (i = 0; i < arySiblings.length; i++)
		    {
			    var objcheckboxSPAN = GetHtmlElement( arySiblings[i] , "SPAN" , "checkbox" )
			    if (objcheckboxSPAN.style.backgroundColor == "silver")
			    bPartial = true
    			
			    if ((arySiblings[i].getAttribute("NodeChecked") == "yes") )
				    bChecked = true;
			    else
				    bPartial = true;				
		    }
		    if (bChecked)
		    {
			    checkSelectedNodeParents(objLI, "red", bPartial)
		    }
		    else
		    {
			    checkSelectedNodeParents(objLI, "white", false)
		    }
	    }
	    //var objcheckboxSPAN = GetHtmlElement( objParent , "SPAN" , "checkbox" )
	    //checkboxState(objcheckboxSPAN, objColor,bPartial)

    }
    //**********  Method added by Rajesh  **************// 
    //**********  Method for Expanding all Nodes  **************// 
    function expandAll(NodeId, expand)
    {
        if(expand == null) expand = true;
	    var s_NodeId=NodeId;
	    if(s_NodeId==null ||  s_NodeId == "") return ;
	    
	    var objLI = GetNodeById(s_NodeId)
	    if(expand == true)
	    {
	        SelectNodeById(s_NodeId)	
        }
        else
        {
            CollapseNode(objLI)
        }
	    
	    for (var i = 0; i < objLI.childNodes.length; i++)
	    {
	        var childNode = objLI.childNodes[i];
	        
	        if(childNode.nodeType == 3) 
	        {
	            continue
	        }        
	        
            if (childNode.getAttribute("type") == "container")
            {
	            for( var j = 0 ; j < childNode.childNodes.length ; j++)
	            {
	                if(childNode.childNodes[j].nodeType == 3) 
	                {
	                    continue
	                }
	                expandAll(childNode.childNodes[j].id, expand)
	            }
            }
	    }
	    
	    if(expand != true)
	    {
	        CollapseNode(objLI);
	    }
	    else
	    {
	        SelectNode (GetNodeById(NodeId),false,true)
	    }
	    
    }
    
    function collapseAll(NodeId)
    {
        expandAll(NodeId, false)
    }

    //rv - ff
    function ExpandNode( objLI , oSync )
    {	
	    var objUL;
	    var objIMG;
	    var objSPAN;
    	
	    objUL = GetHtmlElement(objLI,"DIV","container");
	    
	    if (objUL != null)
	    {
		    objIMG = GetHtmlElement(objLI,"SPAN","toggle");

		    if (objIMG != null)
		    {
			    objSPAN = GetHtmlElement(objLI,"SPAN","label");
			    
			    top.DHTMLLib.removeClass(objUL,"hide")
			    if (objUL.filters && objUL.filters.length > 0)
			    {
				    slideOpen (objUL)
			    }
			    else
			    {
				    //slideOpenEx(objUL)
				    top.DHTMLLib.addClass(objUL,"shown")
			    }

			    //objIMG.children[0].src = "/widgets/deeptree/assets/COLLAPSE.gif";
			    top.XMLLib.getNodeFirstChild(objIMG).className    = "deeptree_collapseImage"
			    objLI.setAttribute("state" , "shown");
			    objLI.setAttribute("overflow" , "auto");
			    
			    return LoadChildren( objLI , oSync );
		    }
	    }
    }
    function initTimer()
    {
	    if (m_tran!=null) return;
	    m_tran =window.document.getElementById("tran2")
	    m_timer =  window.document.getElementById("Timer")
    }

    function slideOpenEx(objUL)
    {
	    if(objUL.oh==null)
		    objUL.oh = objUL.offsetHeight
	    objUL.style.height="1px"	
	    /*objUL.style.border="1px"
	    objUL.style.borderStyle="solid"
	    objUL.style.borderColor="blue"*/
	    var m_speed = 10
    	
	    setTimeout(showBitMore,5);
	    function showBitMore()
	    {
		    objUL.style.height = parseInt(objUL.style.height.replace("px",""))+m_speed
    		
		    if(objUL.oh > objUL.offsetHeight)
		    {
			    var sMsec=10
			    if(objUL.offsetHeight/(objUL.oh/100)<85)
			    {
				    sMsec = 1
				    m_speed = 10
			    }
			    else
			    {
				    sMsec  = 30 - (100-objUL.offsetHeight/(objUL.oh/100))
				    m_speed = (100-objUL.offsetHeight/(objUL.oh/100))/5
			    }

			    /*if(objUL.offsetHeight<50)	
			    {
				    sMsec  = 10
				    m_speed = 1
    				
			    }*/
			    setTimeout(showBitMore,sMsec);
		    }
	    }
    }

    function slideOpen(objUL)
    {
	    m_bSlidingNow = true
	    var iHeight = objUL.offsetHeight;
	    objUL.style.height="2px";
	    objUL.style.zIndex=-1
	    var tryingToDisplay= objUL
	    tryingToDisplay.offsetH = iHeight
	    tryingToDisplay.offsetCounter = 2
	    tryingToDisplay.HeightIncrement = iHeight/5
	    top.DHTMLLib.addClass(objUL,"shown")
	    objUL.filters[0].duration=1
	    objUL.filters[0].Apply()
	    if (objUL.id.length ==0)
		    objUL.id = thisElement.id;
	    m_start = new Date()
	    tryingToDisplay.intervalRef = setInterval (function(){opening(tryingToDisplay)},10);
	    objUL.filters[0].Play()
    	
    }
    var m_start
    var m_offsetCounter,m_scrollHeight

    function opening(tryingToDisplay)
    {
	    if (tryingToDisplay.offsetCounter >= tryingToDisplay.offsetH)
	    {
		    tryingToDisplay.style.height = tryingToDisplay.offsetH
		    setTimeout(function(){completeOpen(tryingToDisplay)},1000);
		    //tryingToDisplay.style.height = null
		    clearInterval(tryingToDisplay.intervalRef)
		    m_bSlidingNow = false
		    //alert(new Date() - m_start)
		    return;
	    }
	    else
	    {
		    tryingToDisplay.style.height =  tryingToDisplay.offsetCounter;
		    //alert(tryingToDisplay.scrollTop)
		    //tryingToDisplay.doScroll("scrollbarPageDown")
		    tryingToDisplay.scrollTop = tryingToDisplay.scrollHeight
		    tryingToDisplay.document.recalc(true)
	    }
	    tryingToDisplay.offsetCounter+=tryingToDisplay.HeightIncrement;
    }

    function completeOpen(tryingToDisplay)
    {
	    tryingToDisplay.style.height = null
    }

    function slideClose(objUL)
    {
	    m_bSlidingNow = true
	    var iHeight = objUL.offsetHeight;
	    objUL.style.zIndex=-1
	    var tryingToDisplay= objUL
	    tryingToDisplay.offsetH = iHeight
	    tryingToDisplay.offsetCounter = iHeight-1
	    tryingToDisplay.HeightIncrement = iHeight/5
	    objUL.filters[0].duration=1
	    objUL.filters[0].Apply()
	    if (objUL.id.length ==0)
		    objUL.id = thisElement.id;
	    tryingToDisplay.intervalRef = setInterval (function(){closing(tryingToDisplay)},10);
	    objUL.filters[0].Play()
    	

    }
    function closing(tryingToDisplay)
    {
	    try{
	    tryingToDisplay.style.height =  tryingToDisplay.offsetCounter;
	    tryingToDisplay.scrollTop = tryingToDisplay.scrollHeight
	    tryingToDisplay.document.recalc(true)
	    }catch(e){}
	    tryingToDisplay.offsetCounter-=tryingToDisplay.HeightIncrement
	    if (tryingToDisplay.offsetCounter <= 2)
	    {
		    clearInterval(tryingToDisplay.intervalRef)
		    m_bSlidingNow = false
		    completeHide(tryingToDisplay);
		    return;
	    }
    }

    function completeHide(tryingToDisplay)
    {
	    tryingToDisplay.style.height = tryingToDisplay.offsetH
	    tryingToDisplay.style.height = null
	    top.DHTMLLib.addClass(tryingToDisplay,"hide")
	    top.DHTMLLib.removeClass(tryingToDisplay,"shown")
    }

    function SelectNodeById(sID)
    {
	    var objLI = GetNodeById(sID)
	    SelectNode (objLI,false,true)
	    if (objLI.type =="parent")
		    ExpandNode(objLI)
    }

    //-----------------------------------------------
    // SelectNode(objLI, bSuppressLink)
    //-----------------------------------------------

    function SelectNode( objLI, bSupressLink, bForceIntoView )
    {
        var objA;
        var objSPAN;
        var sType
	    if( null == objLI ) objLI = GetHtmlElement( thisElement , "div" );
	    if (objLI == null)return;
	    
	    if( objLI.getAttribute("type") == "none" )
	    {
		    objLI_Parent = GetParent( objLI );
		    objLI_Next = GetNextSibling( objLI_Parent );
	    }
    	
        if( bSupressLink != true ) 
        {
            LoadNodeContent(objLI);
        }
        
        HighlightNode(objLI);
        
        fireSelect()
        
        ExpandAncestors( objLI );
        
        ScrollIntoView( objLI, bForceIntoView );
        
        UpdateMessages( objLI );

        try
        {
		    if( "object" == typeof( top.contentbar ) && "object" == typeof( top.contentbar.document.all("showtoc") ) )
		    {
			    top.contentbar.document.all("showtoc").style.display = "none";
		    }
	    }
	    catch(e)
	    {
	    }
    }


    function UpdateMessages( objLI )
    {
        objSPAN = GetHtmlElement(objLI,"SPAN","label");
        if( null != objSPAN )
        {
            window.defaultStatus = objSPAN.title;
            //top.document.title = objSPAN.title;
        }
    }

    ///<summary>Scrolls the elements parent so as to show the node references passed to it. The function performs only if the second parameter is set to <i>True</i> when called </summary>
    function ScrollIntoView( objLI, bScroll )
    {	
        var iY = thisElement.parentNode.scrollTop;
        var iX = thisElement.parentNode.scrollLeft;
        var bScrollY = ( objLI.offsetTop < iY	|| objLI.offsetTop + 19 > iY + thisElement.parentNode.clientHeight );
        var bScrollX = false;
        ( objLI.offsetLeft < iX	|| objLI.offsetLeft + objLI.offsetWidth/2 > iX + thisElement.parentNode.clientWidth );
        
        if( bScroll )
        {
		    var iY = !( bScrollY || bScroll ) ? iY : null 
		    var iX = !( bScrollX || bScroll ) ? iX : null
		    if (iY==null|| iX==null) return 
    	    var iY = objLI.offsetTop - thisElement.parentNode.clientHeight/2;
    	    var iX = objLI.offsetLeft - 15;
            thisElement.parentNode.scrollTo( iX , iY );
	    }
	    
        return;
    }



    function ExpandAncestors( objLI )
    {   
        while( objLI = GetParent( objLI ) )
        {
            if( objLI.state != "shown" ) ExpandNode( objLI );
        }
    }

    //-----------------------------------------------
    // HighlightNode(objLI)
    //-----------------------------------------------
    function HighlightNode(objLI)
      {
      var i = 0;
      var objSPAN;
      var objSPAN_Current;

      objSPAN = GetHtmlElement(objLI,"SPAN","label");
      
        if (objSPAN != null)
        {
            if (objSPAN.classType != "clsUnavailable")
            {
                top.DHTMLLib.removeClass(objSPAN,"clsMouseOver")
                top.DHTMLLib.addClass(objSPAN,"clsCurrentHasFocus")
                objSPAN.classType = "clsCurrentHasFocus";
                
                if (objLI != objLI_Current)
                {
                    
                    if (objLI_Current != "")
                    {
                        objSPAN_Current = GetHtmlElement(objLI_Current,"SPAN","label");
              
                        if (objSPAN_Current != null)
                        {
                            top.DHTMLLib.removeClass(objSPAN_Current,"clsCurrentHasFocus");
                            objSPAN_Current.classType = "";
                        }
                    }
                    
                }
            }
            
	        objLI_Current = objLI;
        }
    }

    function fireSelect()
    {
        try
        {
            var evt = new Object();
            evt.type = "select";
            
  	        if (objLI_Current.getAttribute("data") == null )
	        {
		        objLI_Current.setAttribute("data" , "<document><record><name>" + GetTitle(objLI_Current) + "</name></record></document>");
	        }
	        
	        
            evt.controldata = objLI_Current.getAttribute("data");
            evt.node        = getNodeObject(objLI_Current);
        
            me.raiseEvent("onselect",evt);
        
        }catch(e){}
    }

    //-----------------------------------------------
    // LoadNodeContent(objLI)
    //-----------------------------------------------

    function LoadNodeContent(objLI)
    {
	    try{
        var objSPAN;
        var objA;

        objSPAN = GetHtmlElement(objLI,"SPAN","label");

        if (objSPAN != null)
        {
            objA = GetHtmlElement(objSPAN,"A")
            if (objA != null)
            {

                var sTmpArray = new Array();
                var sHref = String( objA.href );
                var sQuery = "";
                var sHash = "";
                if( "undefined" != sHref )
                {
                    sTmpArray = sHref.split( "#" );
                    if( sTmpArray.length > 1 )
                    {
                        sHref = sTmpArray[0];
                        sHash = sTmpArray[1];
                    }
                    
                    sTmpArray = sHref.split( "?" );
                    sHref = sTmpArray[0];
                    for( var i = 1; i < sTmpArray.length; i++ )
                    {
                        sQuery += "?" + sTmpArray[i];
                    }
                    if( sQuery.indexOf( "frame=" ) == -1 && objA.target == m_objConfig.Target )
                    {
                        sQuery = sQuery.length > 0 ? sQuery + "&frame=true" : "?frame=true";
                    }
                    else
                    {
                        sQuery = sQuery.length > 0 ? sQuery : "";
                    }
                    sHash = sHash.length > 0 ? "#" + sHash : "";
                }

                var sLocation =  sHref + sQuery + sHash;

                if( objA.target )
                {
                    //alert( objA.target );
                    window.open( sLocation , objA.target );
                }
                else
                {
                    top.content.location = sLocation;
                }
            }
        }
        }catch(e){}
    }
    //-----------------------------------------------
    // LoadConfig()
    //-----------------------------------------------

    function Config(strCfgXMLSrc)
    {
        var sPath = "";
        if(strCfgXMLSrc == null)
        {
            strCfgXMLSrc = thisElement.getAttribute("CfgXMLSrc");
        }
        
        if (strCfgXMLSrc != "" && strCfgXMLSrc != null)
        {
        
            var objXMLDoc = objXMLDocTreeTemplate.cloneNode(true) 
            objXMLDoc.async = false;
            try{
            objXMLDoc.load(strCfgXMLSrc);}catch(e){objXMLDoc.loadXML(strCfgXMLSrc)}

            if (objXMLDoc.xml != "")
            {
            
                m_sConfigXML = objXMLDoc.xml;
                
                var documentElement = objXMLDoc.selectSingleNode("/deeptreeconfig");
                
           	    for (i = 0; i < documentElement.childNodes.length; i++)
			    {
			        if(documentElement.childNodes[i].nodeType != 3)
			        {
			            
			            var node = documentElement.childNodes[i];
			            
                        var nodeTagName  = node.tagName;
                        
                        if(nodeTagName != "TypeImages")
                        {
			                var nodeText     = node.text.toLowerCase()
			                var nodeXml      = node.xml
                        
	                        if(nodeText.length != "")
	                        {
			                    this[nodeTagName]             = nodeText
			                    this[nodeTagName + "XML"]     = nodeXml
        
				                if (nodeTagName != "TopXMLSrc")
				                {
				                    if (nodeText == "yes")
				                    {
					                    if (m_objXSLDoc.selectSingleNode("//xsl:param[@name='" + nodeTagName + "']") != null)
					                    {
						                    m_objXSLDoc.selectSingleNode("//xsl:param[@name='" + nodeTagName + "']").text = nodeText;
					                    }
				                    }
				                }
                            }
                            				                
                        }				        
                    }
			    }
			    
            }
        }
        
	    if (thisElement.getAttribute("DefaultParentImage") != null )
	    {
		    m_objXSLDoc.selectSingleNode("//xsl:param[@name='defaultparentimage']").text = top.helperLib.wsfMapPath(thisElement.getAttribute("DefaultParentImage"));
		}
	    else
	    {
		    thisElement.setAttribute("DefaultParentImage", m_objXSLDoc.selectSingleNode("//xsl:param[@name='defaultparentimage']").text) ;
		}

	    if (thisElement.getAttribute("DefaultLeafImage") != null )
	    {
		    m_objXSLDoc.selectSingleNode("//xsl:param[@name='defaultleafimage']").text =  top.helperLib.wsfMapPath(thisElement.getAttribute("DefaultLeafImage"));
		}
	    else
	    {
	        thisElement.setAttribute("DefaultLeafImage", m_objXSLDoc.selectSingleNode("//xsl:param[@name='defaultleafimage']").text) ;
	    }
        
        
    }

    function LoadChildren( objLI , oSync )
    {
        var strXMLSrc = "";
        var strHTML = "";
        var objSPAN;
        var objUL;
    	
        objUL = GetHtmlElement(objLI,"DIV","container");
        if (objUL != null)
        {
		    objSPAN = GetHtmlElement(objLI,"SPAN","label");
	        if ( objUL.childNodes.length == 0 ) 
            {
                objUL.innerHTML = m_sTempNodeStart + m_sLoadingText + m_sTempNodeEnd;
                if (objSPAN != null)
                {
                    strXMLSrc += strRootPath + objSPAN.getAttribute("xmlsrc");
                    
                    GetXML( strXMLSrc , objUL , "shown" , oSync ,true);
    			
				    // Indicate that an asyncronous load is taking place
				    return true;
                }
                
            }
            else if( null != oSync )
            {
                SyncAsync( oSync );
            }
        }
        return false;
    }

    function GetHtmlElement(objParent , strChildTagName , strType)
    {
      var i = 0;
      var returnValue = null;
      var children = null;
      
        if( null != objParent )
        {
            children = objParent.childNodes;
        }

        for (i = 0; children != null && i < children.length; i++)
        {
            var child = children[i];
            if (child.tagName.toUpperCase() == strChildTagName.toUpperCase() && ( child.getAttribute("type") == strType || strType == null ) )
            {
                returnValue = child;
                break;
            }
        }
        return returnValue;
    }

    //-----------------------------------------------
    // GetNextSibling(objLI)
    //-----------------------------------------------

    function GetNextSibling(objLI)
    {
	    var i = 0;
	    var arySiblings;
	    var objRetVal = null;

	    arySiblings = GetSiblings(objLI);

	    if (arySiblings != null)
	    {
		    for (i = 0; i < arySiblings.length; i++)
		    {
		    
			    if (arySiblings[i] == objLI)
			    {
			        objRetVal = arySiblings[i].nextSibling;
			        while(objRetVal != null)
			        {
			            var nodeType = objRetVal.getAttribute("type");
		                if(nodeType == "leaf" || nodeType == "parent" || nodeType == "dummyparent")
		                {
		                    break;
		                }
                        objRetVal = objRetVal.nextSibling;		                
			        }
				    
				    break;
			    }
		    }
	    }
    	
	    return objRetVal;
    }

    //-----------------------------------------------
    // GetPreviousSibling(objLI)
    //-----------------------------------------------

    function GetPreviousSibling(objLI)
    {
	    var j = 0;
	    var arySiblings;
	    var objRetVal = null;

	    arySiblings = GetSiblings(objLI);
        
	    if (arySiblings != null)
	    {
		    for (j = 0; j < arySiblings.length; j++)
		    {
			    if (arySiblings[j] == objLI)
			    {
				    break;
			    }
			    
			    var nodeType = arySiblings[j].getAttribute("type");
			    
			    if(nodeType == "leaf" || nodeType == "parent" || nodeType == "dummyparent")
			    {
			        objRetVal = arySiblings[j];
			    }
		    }
	    }
    	
	    return objRetVal;
    }

    //-----------------------------------------------
    // GetFirstChild(objLI)
    //-----------------------------------------------

    function GetFirstChild(objLI)
    {
	    var aryChildren;
	    var objRetVal = null;

	    aryChildren = GetChildren(objLI);
	    if(aryChildren != null)
	    {
	        objRetVal = aryChildren[0];
	    }    

	    return objRetVal;
    }

    //-----------------------------------------------
    // GetLastChild(objLI)
    //-----------------------------------------------

    function GetLastChild(objLI)
    {
	    var aryChildren;
	    var objRetVal = null;

	    aryChildren = GetChildren(objLI);
	    objRetVal = aryChildren[aryChildren.length-1];

	    return objRetVal;
    }

    //-----------------------------------------------
    // GetParent(objLI)
    //-----------------------------------------------

    function GetParent(objLI)
    {
    
	    var objRetVal = null;

	    if( objLI != null && objLI.parentNode != null )
	    {
		    objRetVal = objLI.parentNode.parentNode;
	    }

		if (null != objRetVal && objRetVal.getAttribute("type") != "parent" &&  objRetVal.getAttribute("type") != "parentdummyparent" )
	    {
		    objRetVal = null;
	    }
    	
	    return objRetVal;
    }

    //-----------------------------------------------
    // GetSiblings(objLI)
    //-----------------------------------------------

    function GetSiblings(objLI, spanParents)
    {
	    var objUL;
	    var aryRetVal = new Array();

	    objUL = objLI.parentNode;

	    if ( objUL != null && objUL.getAttribute("type") == "container" )
	    {
	        
	        addToArray(objUL.childNodes, aryRetVal)
	    }
	    
/*	    if(spanParents == true)
	    {
	        
	        var elParent = objUL.parentNode
	        //add previous parents
	        var el = elParent.previousSibling;

            var children = GetChildren(el);
            if(children != null)
            {
                var previousSet = new Array();
                addToArray(children, previousSet)
                addToArray(aryRetVal, previousSet)
                aryRetVal = previousSet;
            }
            el = el.previousSibling;
    	    
    	    
	        //add next parents
	        el = elParent.nextSibling;
            var children = GetChildren(el);
            if(children != null)
            {
                var nextSet = new Array();
                addToArray(children, nextSet)
                addToArray(nextSet, aryRetVal)
            }
            el = el.nextSibling;
        }
*/      
	    return aryRetVal;
    }
    
    function addToArray(nodes, array)
    {
	    for(var i = 0; i < nodes.length; i++)
	    {
	        array[array.length] = nodes[i];    
	    }
    }

    //-----------------------------------------------
    // GetChildren(objLI)
    //-----------------------------------------------

    function GetChildren(objLI)
    {
	    var objUL;
	    var aryRetVal =  null;

	    objUL = GetHtmlElement( objLI , "DIV" , "container" );
	    if( null != objUL )
	    {
		    aryRetVal = objUL.childNodes;
	    }

	    return aryRetVal;
    }




    //-----------------------------------------------
    // IsChild(objLI_Child, objLI_Parent)
    //-----------------------------------------------

      function IsChild(objLI_Child, objLI_Parent)
        {
        var objLI_Temp;
        var blnRetVal = false;
            
        objLI_Temp = GetParent(objLI_Child);
            
        while (objLI_Temp != null)
          {
          if (objLI_Temp == objLI_Parent)
            {
            blnRetVal = true;
            break;
            }
          objLI_Temp = GetParent(objLI_Temp);
          }
        return blnRetVal;
        }


    //-------------------------------------------------------------------------------------------------
    //                                     ASYNCRONOUS LOAD HANDLERS
    //-------------------------------------------------------------------------------------------------


    function fnAllocCall()
    {
        var iReturn = null;
        for (var i = 0; i < m_iMaxCalls && m_aoCalls[m_iLastCall] != null; i++)
        {
            m_iLastCall = (m_iLastCall + 1) % m_iMaxCalls;
        }
        
        if (i < m_iMaxCalls)
        {
            iReturn = m_iLastCall;
        }
        return iReturn;
    }

    function fnDeAllocCall( iCallIdx )
    {
        m_aoCalls[iCallIdx] = null;
    }



    function CallObject( oXml , oEl , sElClass , oSync , sXMLSrc, iIndex)
    {
        var me = this
        this.oXml = oXml;
        this.oSync = oSync;
        this.oEl = oEl;
        this.sElClass = sElClass;
        this.index = iIndex;
        
        if(sXMLSrc == null)
        {
            fnLoadComplete();
        }
        else
        {
            oXml.onreadystatechange  = fnLoadComplete
            oXml.load(sXMLSrc);
        }
        
        function fnLoadComplete()
        {
            try
            {
                var iReadyState = me.oXml.readyState;
            }
            catch(e)
            {
                return;
            }
            
            if(  iReadyState != 4 ) return;
            
            if(me.oXml.xml != "" )
            {
                aryXMLNodes = me.oXml.documentElement.selectNodes("//TreeRef[@NodeXmlSrc]");

		        for (i = 0; i < aryXMLNodes.length; i++)
                {
                    var objXMLDoc_Child = objXMLDocTreeTemplate.cloneNode(true) 
                    objXMLDoc_Child.async = false;
                    objXMLDoc_Child.load(strRootPath + aryXMLNodes[i].getAttribute("NodeXmlSrc"));

                    if( null != objXMLDoc_Child.documentElement )
                    {
                        aryXMLNodes[i].parentNode.replaceChild(objXMLDoc_Child.documentElement, aryXMLNodes[i]);
                    }
                    objXMLDoc_Child = null;
                }


                var bFixLoad = false;
                
                //bFixLoad = me.oEl.contains( objLI_Current );
                
                
                if (m_objXSLDoc.xml != "")
                {
                    var sHtml = transformNode(me.oXml);
                } 
                
	            if ( sHtml != null && sHtml != "" )
                {
			        if(objLI_Current != null)
			        {
        		        alterTreeState(sHtml , objLI_Current.id);
        		    }
        	        else
        	        {
        		        m_objStateXML.loadXML("<root>" + sHtml + "</root>")
        		        getState(true)	
        	        }
        	        
			        sHtml =  fixHTML(sHtml)

                    me.oEl.innerHTML = sHtml;
        //          if (!bGradientInitialised) setTimeout(alterXPGradient,40)
        //          document.attachEvent("onreadystatechange",alterXPGradient)
                }
                else
                {
                    me.oEl.innerHTML = m_sTempNodeStart + m_sUnavailableText + m_sTempNodeEnd;
                }
                
                if( bFixLoad )
                {
			        SelectNode( top.XMLLib.getNodeFirstChild(me.oEl) );
                }
                
                if( me.index == m_iMasterIdx && m_bSyncFailed == true )
                {
                    Sync();
                }
                
                
                if( me.oSync != null )
                {
                    SyncAsync( me.oSync );
                }
                
                
                if( null != objLI_Current && objLI_Current.selectChild ) MoveNext();
                fnDeAllocCall( iIndex );
            }
            else
            {
                me.oEl.innerHTML = m_sTempNodeStart + m_sUnavailableText + m_sTempNodeEnd;
            }
            
            fireOnLoadAsync();
            return;
        }
    }
    
    //rv ff
    function alterTreeState(sHtml,sNodeId)
    {
	    var oContainer = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + sNodeId + "']")
	    
	    if(oContainer == null)
	    {
		    oContainer = m_objTreeNodeState.selectSingleNode("/Tree");
        }
        
	    var oNewNodeXML = objXMLDocTreeTemplate.cloneNode(true);
	    
	    oNewNodeXML.loadXML ("<root>" + sHtml +"</root>");
	    
	    var sTransformedXML = transformNode(oNewNodeXML, m_objStateXSLDoc);
    	
	    oNewNodeXML.loadXML("<root>" + sTransformedXML + "</root>")
	    //alert(sHtml)
	    var objChildNodes = oNewNodeXML.selectNodes("/root/*")

	    if(objChildNodes.length > 0)
	    {
		    oContainer.setAttribute("type","") 
		    oContainer.setAttribute("class","") 
	    }

	    for (var i=0;i<objChildNodes.length;i++)
	    {
		    oContainer.appendChild(objChildNodes[i].cloneNode(true))
	    }
    }

    function getSpeedDate()
    {
	    dt = new Date()
	    return "----" + dt.getMinutes() + ":" + dt.getSeconds() + ":" + dt.getMilliseconds() + " "
    }


    function refreshUI()
    {
	    setTimeout( alterXPGradient,500);
    }

    function alterXPGradient()
    {
    return
	    var objLinks = window.document.getElementsByTagName("LINK")
	    for (var i=0;i< objLinks.length;i++)
	    {
		    if (objLinks[i].href.toLowerCase().indexOf("deeptree")>=0)
		    {
			    break;
		    }	
	    }
	    var a,sEndColor="buttonface",sContainerBack="buttonface",sTreeBody = "threedlightshadow"
	    if (i==objLinks.length) return
	    try
	    {
		    a = new ActiveXObject("syscolorctrl.syscolorctrl")
    //		sEndColor = "#" + a.HEXinactivecaption;
		    sEndColor =  "#" + a.GetDerivedHex("window", "activecaption",'CSS',90)
		    sContainerBack = "#" + a.GetDerivedHex("window", "activecaption",'CSS',15)
		    sTreeBody = "#" + a.GetDerivedHex("window", "activecaption",'CSS',100)
	    }
	    catch(e){}
	    var iStyleCount = 0

	    var colStyleSheets = window.document.styleSheets
	    for (i=0;i<colStyleSheets.length;i++)
	    {
    //		if (colStyleSheets[i].href!=null && colStyleSheets[0].href.toLowerCase().indexOf("deeptreexpstyle.css") >=0)
    //		{
			    for (var j=0;j<colStyleSheets[i].rules.length;j++)
			    {
				    if(colStyleSheets[i].rules[j].selectorText.toLowerCase()==".clsparentlabelfilter")
				    {
					    colStyleSheets[i].rules[j].style.cssText = "filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=white, endColorstr=" + sEndColor + ")"
					    iStyleCount++
				    }
				    if(colStyleSheets[i].rules[j].selectorText.toLowerCase() == ".clsrightcurvegradient" )
				    {
					    colStyleSheets[i].rules[j].style.cssText = "filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr="+ sEndColor + ", endColorstr=" + sEndColor + ")"
					    iStyleCount++
				    }
				    if(colStyleSheets[i].rules[j].selectorText.toLowerCase() == "div.clscontainer" )
				    {
					    colStyleSheets[i].rules[j].style.backgroundColor =  sContainerBack
					    iStyleCount++
				    }
				    if(colStyleSheets[i].rules[j].selectorText.toLowerCase()==".treebody")
				    {
    //					colStyleSheets[i].rules[j].style.backgroundColor =  sTreeBody
					    iStyleCount++
    					
				    }
				    if (iStyleCount==4) break;
			    }
    //			break;
    //		}		
	    }
		    if (iStyleCount!=4) 
		    {
			    setTimeout( alterXPGradient,500);
		    }
		    else
			    bGradientInitialised = true
    	
    //	alert(document.styleSheets[0].rules[0].selectorText)

    //	window.document.body.insertAdjacentHTML("afterBegin","<style>.clsparentlabelFilter{);}</style>");
    	
    }

    var m_objStateXML = objXMLDocTreeTemplate.cloneNode(true)

    function breatheAndRebuild(sHtml)
    {
	    thisElement.innerHTML=sHtml
	    fireOnLoad();
    }

    function fixHTML(sHtml)
    {
	    sHtml = sHtml.replace(/\&gt;/g,">")
	    sHtml = sHtml.replace(/\&lt;/g,"<")
//	    sHtml = sHtml.replace(/(?!<xml>)\&lt;(?!<\/xml>)/g,"<")
//	    sHtml = sHtml.replace(/(?!<xml>)\&gt;(?!<\/xml>)/g,">")
//clipboardData.setData("text",sHtml)
        //sTransformNode = sTransformNode.replace(/&lt;/g,"<").replace(/&gt;/g,">");
	    sHtml = sHtml.replace(/%3C/g,"&lt;")
	    sHtml = sHtml.replace(/%3E/g,"&gt;")
	    return sHtml	
    }

    function rebuild(sTreeXML)
    {
        var objXMLDoc = objXMLDocTreeTemplate.cloneNode(true) 
//sTreeXML = '<Tree><TreeNode Title="Help" NodeImgSrc="/widgets/assets/taskhelp16.gif" type="dummyparent" SystemSortOrder="100"><xml><def><id>0.7</id><type>menulevel1</type><ispopup>true</ispopup><isevent>false</isevent><splash><text>Help</text></splash><MenuDisplayName>Help</MenuDisplayName></def></xml></TreeNode></Tree>'

	    objXMLDoc.loadXML (sTreeXML);	

        if (m_objXSLDoc.xml != "")
        {
        
		    initializeEnvironment(m_sConfigXML)
//            clipboardData.setData('text',sTreeXML )


            var sHtml = transformNode(objXMLDoc)


            m_objStateXML.loadXML("<root>" + sHtml + "</root>")
            
            //clipboardData.setData('text',sHtml )
            sHtml =  fixHTML(sHtml)
            
            
		                //clipboardData.setData('text',sHtml )

            
            getState(true)
		    if(sHtml.length > 0)
		    {
 //   		clipboardData.setData('text',sHtml)
 //   		alert("test:" + sHtml)
			    thisElement.innerHTML = ""
			    //setTimeout(function(){breatheAndRebuild(sHtml)},40);
			    breatheAndRebuild(sHtml);
		    }
        }
        objLI_Current = null
	    sMeta =sTreeXML;   
    }

    function transformNode(objXMLDoc,xslDoc)
    {
        if(xslDoc == null)
        {
            xslDoc = replaceUID();
        }
        
        var sXML = objXMLDoc.xml;
        
        sXML = sXML.replace("</Tree>",m_sConfigXML + "</Tree>");
        
        
        //objXMLDoc.loadXML(sXML);
        
        var sTransformNode = top.XMLLib.transformXML(sXML, xslDoc.xml, true)
        sTransformNode = sTransformNode.replace(/<root>/i,"").replace(/<\/root>/i,"");
        //var sTransformNode =  objXMLDoc.transformNode(xslDoc);
        
        
        //clipboardData.setData("text",sTransformNode)
        
        return sTransformNode;
    }

    function GetNodeById(sID)
    {
	    var objLI = document.getElementById(sID);
	    
	    if (objLI != null && objLI[0] == "undefined")
	    {
		    return objLI[0];
        }
	    else if(objLI == null)
	    {
		    var objTN = m_objTreeNodeState.selectSingleNode("//TreeNode[@NodeId='" + sID + "']")
		    if(objTN!=null)
			    return GetNodeById(objTN.getAttribute("Id"))
    			
	    }
	    else
	    {
		    return objLI
		}
	    return null;
    }

    //rv - ff
    function RemoveTreeNode(sNodeId)
    {
	    var objLI = GetNodeById(sNodeId);
	    
	    if (objLI == null)
	    {
		    return;
        }
        
	    var objLIParentContainer    = objLI.parentNode;
	    var objLIParentNode         = GetNodeParent(objLI);
	    
	    objLIParentContainer.removeChild(objLI);
	    
	    if (objLIParentContainer.childNodes.length == 0)
	    {
		    try
		    {
		        objLIParentNode.removeChild(objLIParentContainer)
		        objLIParentNode.setAttribute("type", "leaf");
		    
		        var toggleElement = top.XMLLib.getNodeFirstChild(objLIParentNode);
		        toggleElement.className = "clsLeaf";
		        top.XMLLib.getNodeFirstChild(toggleElement).className = "";
		    
		    }catch(e){}
	    }
    //remove the node from memory xml
	    //var oNodeToRemove = m_objStateXML.selectSingleNode("//div[@id='"  + objLI.id + "']")
    	
	    var oNodeToRemove = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + objLI.id + "']")
	    
	    var oNodeParent = oNodeToRemove.parentNode
	    oNodeParent.removeChild(oNodeToRemove)
	    
	    if (objLIParentContainer.childNodes.length == 0)
	    {
		    oNodeParent.setAttribute("type","leaf") 
		    oNodeParent.setAttribute("class","clsLeaf")  
	    }
	    
	    //alert('Children::' + oNodeParent.xml)
    //***	
    	
	    SelectNode (objLIParentNode,false,true)
    }

    function GetNodeParent(objLI)
    {
	    var objLIParent = objLI.parentNode;
	    if (objLIParent.id == thisElement.id)
	    {
		    return (thisElement);
        }
	    objLIParent = objLIParent.parentNode;
	    return (objLIParent)
    }

    function pasteNode()
    {
	    if (m_nodeClipboard==null)return
	    addNodeByXML("<Tree>" + m_nodeClipboard.xml + "</Tree>", GetId())
	    ExpandNode(objLI_Current);
    }

    //rv ff
    function getTimeSuffix()
    {
        var date = new Date();
        return date.getHours() + "" + date.getMinutes() + "" + date.getSeconds() + "" + date.getMilliseconds();
    }

    function replaceUID()
    {
        var objLocalXSLDoc = m_objXSLDoc.cloneNode(true);
        objLocalXSLDoc.loadXML(m_objXSLDoc.xml.replace('uidp', thisElement.id + getTimeSuffix()));
        return objLocalXSLDoc
    }
    

    //rv ff
    function addNodeByXML(sNodeXML,sNodeId)
    {
	    var sUniqueID
	    var objLocalXSLDoc = replaceUID();
	    
	    if( sNodeId != null)
	    {
		    objLI = GetNodeById(sNodeId)
	    }
	    else
	    {	
		    if( null == objLI_Current) objLI_Current = GetHtmlElement( thisElement , "div" );
		    if( null == objLI_Current) return;
		    objLI = objLI_Current;
	    }

		
	    var objXMLDoc_Child = objXMLDocTreeTemplate.cloneNode(true) 
	    objXMLDoc_Child.loadXML(sNodeXML)
	    

	    var sHTML =  transformNode(objXMLDoc_Child, objLocalXSLDoc)//objXMLDoc_Child.transformNode(objLocalXSLDoc)
	    
	    objXMLDoc_Child.loadXML(sHTML)
	    
	    
	    
	    sUniqueID = objXMLDoc_Child.documentElement.getAttribute("id")
	    
	    sHTML = objXMLDoc_Child.documentElement.xml
	    
	    var sHTMLForDisplay =  fixHTML(sHTML)
    	
	    sNewNodeTag = "#transformedHTML#" //unescape(sHTML)
	    var objContainer = GetHtmlElement(objLI,"div","container")
	    
	    if(sNodeId == "dt_root")	
	    {
		    objLI           = new Object();
		    objLI.type      = "parent";
		    objLI.id        = sNodeId;
		    objContainer    = thisElement;
	    }
	    
	    if(objLI.getAttribute("type") == "parentdummyparent")
	    {
	        objLI.setAttribute("type" , "parent");
	    }
	    
	    if (objLI.getAttribute("type") == "leaf" || objLI.type == "leaf") 
	    {
		    if (objContainer == null) 
		    {
			    sNewNodeTag = sNewParentStartTag + "#transformedHTML#" + sNewParentEndTag;
			    var toggleElement = top.XMLLib.getNodeFirstChild(objLI);
			    
			    toggleElement.className = "clsCollapse clsparent clsCollapseParent";
			    top.XMLLib.getNodeFirstChild(toggleElement).className = "deeptree_collapseImage";
			    
			    if(m_objConfig.HideParentImages != 'yes')
			    {
				    var objIMG = objLI.childNodes[1];
				    
				    if (objIMG == null)
				    {
					    objIMG = objLI.childNodes[2];
                    }
				    try
				    {
					    if (objIMG.getAttribute("src") == null)
					    {
						    objIMG.src = DefaultParentImage;
					    }
				    }
				    catch(e){}
				    
				    //alert(objIMG.outerHTML)
			    }
			    objContainer = objLI
		    }
		    
		    objLI.setAttribute("type", "parent")
	    }
    	
	    objContainer.insertAdjacentHTML ("beforeend",sNewNodeTag.replace("#transformedHTML#",sHTMLForDisplay))

	    //add the node to the memory xml
	    alterTreeState(sNewNodeTag.replace("#transformedHTML#",sHTML),objLI.id)

	    ExpandNode (objLI);
    	
	    return (sUniqueID);

    }
    
    function getChildContainer(nd)
    {
        var container = GetHtmlElement( nd , "DIV" , "container" );
        
        if(container == null)
        {
		    var toggleElement = top.XMLLib.getNodeFirstChild(nd);
		    
		    toggleElement.className = "clsCollapse clsparent clsCollapseParent";
		    top.XMLLib.getNodeFirstChild(toggleElement).className = "deeptree_expandImage";
        
	        if(m_objConfig.HideParentImages != 'yes')
	        {
		        var objIMG = nd.childNodes[1];
    		    
		        if (objIMG == null)
		        {
			        objIMG = nd.childNodes[2];
                }
		        try
		        {
			        if (nd.getAttribute("src") == null)
			        {
				        nd.src = DefaultParentImage;
			        }
		        }
		        catch(e){}
    		    
		        //alert(objIMG.outerHTML)
	        }
	    
	        nd.setAttribute("type", "parent")
            nd.insertAdjacentHTML("beforeEnd", sNewParentStartTag + sNewParentEndTag)
            container = GetHtmlElement( nd , "DIV" , "container" );
        }
	    
        
        return container;
        
        
    }

    function AddNode(sNewNodeName, sImage, sNodeId, sNodeXML, className)
    {
        if(className != null)
        {
            className = " class='" + className + "' ";
        }
        else
        {
            className = "";
        }
    
	    if(sNodeXML == null)
	    {
		    sNodeXML = "";
        }
    	
	    if (sImage != null && sImage.length > 0)
	    {
		    sImage = "NodeImgSrc='" + sImage + "'";
        }
	    else
	    {
		    sImage = "";
        }
	    return addNodeByXML("<Tree><TreeNode Title='"+ sNewNodeName +"' "  + sImage + className + " ><xml>" + sNodeXML + "</xml></TreeNode></Tree>",sNodeId)
    }

    function GetText()
    {
	    var objLI = objLI_Current
	    if (objLI == null) objLI = GetHtmlElement( thisElement , "div" );
	    return GetTitle(objLI)
    }

    function GetPath()
    {
	    var sInnerText,sPath
	    var objLI = objLI_Current
	    if (objLI == null) objLI = GetHtmlElement( thisElement , "div" );
	    sPath = ""
	    while (objLI != null)
	    {
		    sInnerText = GetTitle(objLI);
		    sPath = "/" + VBTrim(sInnerText) + sPath;
		    objLI = GetParent(objLI);
	    }
	    return (sPath);
    }


    // the function GetId() returns an internally generated unique id for the current node 
    // or the root node if there is no current node selected.
    // If an argument is provided it will assume this argument to have been sent across as the NodeId attribute in the 
    // definition of the Tree
    function GetId()
    {
	    var sID
	    if (arguments.length >0)
	    {
		    sID = getIdByNodeId(thisElement,arguments[0])
	    }
	    else
	    {
		    var objLI = objLI_Current
    		
		    if (objLI == null) objLI = GetHtmlElement( thisElement , "div" );
		    sID = objLI.id;
		    if (sID.length == 0)
		    {
	    //		sID = thisElement.id;
	    //		objLI.id = sID;
		    }
	    }	
	    return (sID);
    }

    function getIdByNodeId(objParent,sId)
    {
	    var objChildren = objParent.childNodes;
	    
	    for(var i = 0 ; i < objChildren.length ; i++)
	    {
	        if(objChildren[i].nodeType == 3) continue;
	    
		    var sNodeId = objChildren[i].getAttribute("NodeId");
		    
		    if (sNodeId == sId)
		    {
			    return objChildren[i].id;
		    }
		    else
		    {
			    var sReturnId = getIdByNodeId(objChildren[i] , sId)
			    if(sReturnId.length > 0)
			    {
				    return sReturnId;
			    }
		    }		
	    }
    			
	    return ""
    }

    function GetDef()
    {
	    var sID
	    var objLI = objLI_Current
	    if (objLI == null) objLI = GetHtmlElement( thisElement , "div" );
	    
	    if (objLI != null)
	    {
		    for(i = objLI.childNodes.length-1 ; i >= 0; i--)
		    {
		        if(objLI.childNodes[i].nodeType == 3) continue;
			    if (objLI.childNodes[i].tagName.toLowerCase() == "xml" )
			    {
				    return (objLI.childNodes[i]);
				}
		    }
	    }
    }

    function GetType()
    {
	    var sID
	    var objLI = objLI_Current
	    if (objLI == null) objLI = GetHtmlElement( thisElement , "div" );
	    return objLI.type;
    }

    function isRootNode()
    {
	    var objLI = objLI_Current
	    if (objLI == null) 
		    return true 
	    if (objLI.parentNode.id == thisElement.id)
		    return true
	    return false	
    }	

    //rv - ff
    function GetTitle(objLI)
    {
	    var sReturnValue = "";
	    sReturnValue = GetHtmlElement( objLI , "SPAN" , "label" ).innerHTML;

	    if (sReturnValue.indexOf("+") == 1 || sReturnValue.indexOf("-") == 1 || sReturnValue.indexOf(".") == 1)
	    {
		    sReturnValue = sReturnValue.substr(2);
        }
	    return sReturnValue
    }

    function GetTitleElement(objLI)
    {
	    var objReturnValue;
	    objReturnValue = GetHtmlElement( objLI , "SPAN" , "label" );
	    return objReturnValue;
    }

    //rv ff
    function SetTitle(objLI,sNewTitle)	
    {
	    GetHtmlElement( objLI , "SPAN" , "label" ).innerHTML =  sNewTitle ;

    //change the node in memory xml
	    var oNodeToChange = m_objTreeNodeState.selectSingleNode("//TreeNode[@Id='"  + objLI.id + "']")
	    sNewTitle = sNewTitle.replace(/</g,"&amp;lt;")
	    sNewTitle = sNewTitle.replace(/>/g,"&amp;gt;")
	    oNodeToChange.setAttribute("Title",sNewTitle)
	    //alert('Children::' + oNodeParent.xml)
    //***	
    	
    }

    //rv ff
    function SetCurrentNodeTitle(sTitle)
    {
	    SetTitle(objLI_Current,sTitle)
    }

    function setCurrentNodeTitleByID(sTitle, sNodeId)
    {
	    if(sNodeId!=null)
	    {
		    objLI = GetNodeById(sNodeId)
	    }
	    
	    SetTitle(objLI,sTitle)
    }

    function getState(bForce)
    {
	    var sTreeStructure
	    m_strDate= getSpeedDate()
	    
	    
	    
	    if(bForce == false || bForce == null && m_objTreeNodeState != null)
	    {
		    return m_objTreeNodeState.xml	
        }
        
        
	    if(m_objTreeNodeState == null)
	    {
		    m_objTreeNodeState = objXMLDocTreeTemplate.cloneNode(true)
        }
        
	    //sTreeStructure = m_objStateXML.transformNode(m_objStateXSLDoc)
	    sTreeStructure = transformNode(m_objStateXML , m_objStateXSLDoc)
	    
	    m_strDate+= "\n" + getSpeedDate()
	    m_objTreeNodeState.loadXML("<Tree Title='root'>" +  sTreeStructure + "</Tree>")

	    return m_objTreeNodeState.xml
    }
}
