/************************************************************************************************************
Drag and drop folder tree
Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.

Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com


************************************************************************************************************/

	var JSTreeObj = Array();
	var numTree = 0;
	var treeUlCounter = 0;
	
	/* Constructor */
	function JSDragDropTree()
	{
		var idOfTree;
		var imageFolder;
		var folderImage;
		var plusImage;
		var minusImage;
		var maximumDepth;
		var dragNode_source;
		var dragNode_parent;
		var dragNode_sourceNextSib;
		var dragNode_noSiblings;
		var ajaxObjects;

		var dragNode_destination;
		var floatingContainer;
		var dragDropTimer;
		var dropTargetIndicator;
		var insertAsSub;
		var indicator_offsetX;
		var indicator_offsetX_sub;
		var indicator_offsetY;

		this.imageFolder = 'images/';
		this.folderImage = 'dhtmlgoodies_folder.gif';
		this.plusImage = 'dhtmlgoodies_plus.gif';
		this.minusImage = 'dhtmlgoodies_minus.gif';
		this.maximumDepth = 6;
		var messageMaximumDepthReached;
		var filePathRenameItem;
		var filePathDeleteItem;
		var additionalRenameRequestParameters = {};
		var additionalDeleteRequestParameters = {};
        // sneg
        var contextMenuAllowed;

		var renameAllowed;
		var deleteAllowed;
		var currentlyActiveItem;
		var contextMenu;
		var currentItemToEdit;		// Reference to item currently being edited(example: renamed)
		var helpObj;

		this.contextMenu = false;
		this.floatingContainer = document.createElement('UL');
		this.floatingContainer.style.position = 'absolute';
		this.floatingContainer.style.display='none';
		this.floatingContainer.id = 'floatingContainer';
		this.insertAsSub = false;
		document.body.appendChild(this.floatingContainer);
		this.dragDropTimer = -1;
		this.dragNode_noSiblings = false;
		this.currentItemToEdit = false;

		if(document.all){
			this.indicator_offsetX = 2;	// Offset position of small black lines indicating where nodes would be dropped.
			this.indicator_offsetX_sub = 4;
			this.indicator_offsetY = 2;
		}else{
			this.indicator_offsetX = 1;	// Offset position of small black lines indicating where nodes would be dropped.
			this.indicator_offsetX_sub = 3;
			this.indicator_offsetY = 2;
		}
		if(navigator.userAgent.indexOf('Opera')>=0){
			this.indicator_offsetX = 2;	// Offset position of small black lines indicating where nodes would be dropped.
			this.indicator_offsetX_sub = 3;
			this.indicator_offsetY = -7;
		}

		this.messageMaximumDepthReached = ''; // Use '' if you don't want to display a message

		this.contextMenuAllowed = true;
		this.renameAllowed = true;
		this.deleteAllowed = true;
		this.currentlyActiveItem = false;
		this.filePathRenameItem = 'folderTree_updateItem.php';
		this.filePathDeleteItem = 'folderTree_updateItem.php';
		this.ajaxObjects = new Array();
		this.helpObj = false;

		this.RENAME_STATE_BEGIN = 1;
		this.RENAME_STATE_CANCELED = 2;
		this.RENAME_STATE_REQUEST_SENDED = 3;
		this.renameState = null;
	}


	/* JSDragDropTree class */
	JSDragDropTree.prototype = {
		// {{{ addEvent()
	    /**
	     *
	     *  This function adds an event listener to an element on the page.
	     *
	     *	@param Object whichObject = Reference to HTML element(Which object to assigne the event)
	     *	@param String eventType = Which type of event, example "mousemove" or "mouseup"
	     *	@param functionName = Name of function to execute.
	     *
	     * @public
	     */
		addEvent : function(whichObject,eventType,functionName)
		{
		  if(whichObject.attachEvent){
		    whichObject['e'+eventType+functionName] = functionName;
		    whichObject[eventType+functionName] = function(){whichObject['e'+eventType+functionName]( window.event );}
		    whichObject.attachEvent( 'on'+eventType, whichObject[eventType+functionName] );
		  } else
		    whichObject.addEventListener(eventType,functionName,false);
		}
		// }}}
		,
		// {{{ removeEvent()
	    /**
	     *
	     *  This function removes an event listener from an element on the page.
	     *
	     *	@param Object whichObject = Reference to HTML element(Which object to assigne the event)
	     *	@param String eventType = Which type of event, example "mousemove" or "mouseup"
	     *	@param functionName = Name of function to execute.
	     *
	     * @public
	     */
		removeEvent : function(whichObject,eventType,functionName)
		{
		  if(whichObject.detachEvent){
		    whichObject.detachEvent('on'+eventType, whichObject[eventType+functionName]);
		    whichObject[eventType+functionName] = null;
		  } else
		    whichObject.removeEventListener(eventType,functionName,false);
		}
		,
		Get_Cookie : function(name) {
		   var start = document.cookie.indexOf(name+"=");
		   var len = start+name.length+1;
		   if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
		   if (start == -1) return null;
		   var end = document.cookie.indexOf(";",len);
		   if (end == -1) end = document.cookie.length;
		   return unescape(document.cookie.substring(len,end));
		}
		,
		// This function has been slightly modified
		Set_Cookie : function(name,value,expires,path,domain,secure) {
			expires = expires * 60*60*24*1000;
			var today = new Date();
			var expires_date = new Date( today.getTime() + (expires) );
		    var cookieString = name + "=" +escape(value) +
		       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") +
		       ( (path) ? ";path=" + path : "") +
		       ( (domain) ? ";domain=" + domain : "") +
		       ( (secure) ? ";secure" : "");
		    document.cookie = cookieString;
		}
		,
		setFileNameRename : function(newFileName)
		{
			this.filePathRenameItem = newFileName;
		}
		,
		setFileNameDelete : function(newFileName)
		{
			this.filePathDeleteItem = newFileName;
		}
		,
		setAdditionalRenameRequestParameters : function(requestParameters)
		{
			this.additionalRenameRequestParameters = requestParameters;
		}
		,
		setAdditionalDeleteRequestParameters : function(requestParameters)
		{
			this.additionalDeleteRequestParameters = requestParameters;
		}
		,setRenameAllowed : function(renameAllowed)
		{
			this.renameAllowed = renameAllowed;
		}
		,
		setDeleteAllowed : function(deleteAllowed)
		{
			this.deleteAllowed = deleteAllowed;
		}
		,setMaximumDepth : function(maxDepth)
		{
			this.maximumDepth = maxDepth;
		}
		,setMessageMaximumDepthReached : function(newMessage)
		{
			this.messageMaximumDepthReached = newMessage;
		}
		,
		setImageFolder : function(path)
		{
			this.imageFolder = path;
		}
		,
		setFolderImage : function(imagePath)
		{
			this.folderImage = imagePath;
		}
		,
		setPlusImage : function(imagePath)
		{
			this.plusImage = imagePath;
		}
		,
		setMinusImage : function(imagePath)
		{
			this.minusImage = imagePath;
		}
		,
		setTreeId : function(idOfTree)
		{
			this.idOfTree = idOfTree;
		}
		,
		expandAll : function()
		{
			var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');
			for(var no=0;no<menuItems.length;no++){
				var subItems = menuItems[no].getElementsByTagName('UL');
				if(subItems.length>0 && subItems[0].style.display!='block'){				    //
					JSTreeObj[numTree].showHideNode(false,menuItems[no].id);
				}
			}
		},
		expandList : function(vis_list)
		{
			var subItems;
			var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');
			for(var no=0;no<menuItems.length;no++){
		    	subItems = menuItems[no].getElementsByTagName('UL');
				if(subItems && subItems.length>0) {
			    	if(vis_list.indexOf(menuItems[no].id) == -1) {
			    		subItems[0].style.display = "none";
			    		continue;
			    	}


					if(subItems.length>0 && subItems[0].style.display!='block'){					    //
						JSTreeObj[numTree].showHideNode(false,menuItems[no].id);
					}

                }
			}
		}
		,
		collapseAll : function()
		{
			var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');
			for(var no=0;no<menuItems.length;no++){
				var subItems = menuItems[no].getElementsByTagName('UL');
				if(subItems.length>0 && subItems[0].style.display=='block'){				    //
					JSTreeObj[numTree].showHideNode(false,menuItems[no].id);
				}
			}
		}
		,
		/*
		Find top pos of a tree node
		*/
		getTopPos : function(obj){
			var top = obj.offsetTop/1;
			while((obj = obj.offsetParent) != null){
				if(obj.tagName!='HTML')top += obj.offsetTop;
			}
			if(document.all)top = top/1 + 13; else top = top/1 + 4;
			return top;
		}
		,
		/*
		Find left pos of a tree node
		*/
		getLeftPos : function(obj){
			var left = obj.offsetLeft/1 + 1;
			while((obj = obj.offsetParent) != null){
				if(obj.tagName!='HTML')left += obj.offsetLeft;
			}

			if(document.all)left = left/1 - 2;
			return left;
		}

		,
		showHideNode : function(e,inputId)
		{
			if(inputId){
				if(!document.getElementById(inputId))return;
				thisNode = document.getElementById(inputId).getElementsByTagName('IMG')[0];
			}else {
				thisNode = this;
				if(this.tagName=='A')thisNode = this.parentNode.getElementsByTagName('IMG')[0];

			}
			if(thisNode.style.visibility=='hidden')return;
			var parentNode = thisNode.parentNode;
			inputId = parentNode.id.replace(/[^0-9]/g,'');
			//
			if(thisNode.src.indexOf(JSTreeObj[numTree].plusImage)>=0){
				thisNode.src = thisNode.src.replace(JSTreeObj[numTree].plusImage,JSTreeObj[numTree].minusImage);
				var ul = parentNode.getElementsByTagName('UL')[0];
				ul.style.display='block';
				if(!initExpandedNodes)initExpandedNodes = ',';
				if(initExpandedNodes.indexOf(',' + inputId + ',')<0) initExpandedNodes = initExpandedNodes + inputId + ',';
			}else{
				thisNode.src = thisNode.src.replace(JSTreeObj[numTree].minusImage,JSTreeObj[numTree].plusImage);
				parentNode.getElementsByTagName('UL')[0].style.display='none';
				initExpandedNodes = initExpandedNodes.replace(',' + inputId,'');
			}
			JSTreeObj[numTree].Set_Cookie('dhtmlgoodies_expandedNodes',initExpandedNodes,500);
			return false;
		}
		,
		/* Initialize drag */
		initDrag : function(e)
		{
			if(document.all)e = event;

			var subs = JSTreeObj[numTree].floatingContainer.getElementsByTagName('LI');
			if(subs.length>0){
				if(JSTreeObj[numTree].dragNode_sourceNextSib){
					JSTreeObj[numTree].dragNode_parent.insertBefore(JSTreeObj[numTree].dragNode_source,JSTreeObj[numTree].dragNode_sourceNextSib);
				}else{
					JSTreeObj[numTree].dragNode_parent.appendChild(JSTreeObj[numTree].dragNode_source);
				}
			}

			JSTreeObj[numTree].dragNode_source = this.parentNode;
			JSTreeObj[numTree].dragNode_parent = this.parentNode.parentNode;
			JSTreeObj[numTree].dragNode_sourceNextSib = false;


			if(JSTreeObj[numTree].dragNode_source.nextSibling)JSTreeObj[numTree].dragNode_sourceNextSib = JSTreeObj[numTree].dragNode_source.nextSibling;
			JSTreeObj[numTree].dragNode_destination = false;
			JSTreeObj[numTree].dragDropTimer = 0;
			JSTreeObj[numTree].timerDrag();
			return false;
		}
		,
		timerDrag : function()
		{
			if(this.dragDropTimer>=0 && this.dragDropTimer<10){
				this.dragDropTimer = this.dragDropTimer + 1;
				setTimeout('JSTreeObj['+num+'].timerDrag()',20);
				return;
			}
			if(this.dragDropTimer==10)
			{
				JSTreeObj[numTree].floatingContainer.style.display='block';
				JSTreeObj[numTree].floatingContainer.appendChild(JSTreeObj[numTree].dragNode_source);
			}
		}
		,
		moveDragableNodes : function(e)
		{			if(JSTreeObj[numTree].dragDropTimer<10)return;
            if(document.all)e = event;
            dragDrop_x = e.clientX/1 + 5 + document.body.scrollLeft;
            dragDrop_y = e.clientY/1 + 5 + document.documentElement.scrollTop;

            JSTreeObj[numTree].floatingContainer.style.left = dragDrop_x + 'px';
            JSTreeObj[numTree].floatingContainer.style.top = dragDrop_y + 'px';

            var thisObj = this;
            if(thisObj.tagName=='A' || thisObj.tagName=='IMG')thisObj = thisObj.parentNode;

            JSTreeObj[numTree].dragNode_noSiblings = false;
            var tmpVar = thisObj.getAttribute('noSiblings');
            if(!tmpVar)tmpVar = thisObj.noSiblings;
            if(tmpVar=='true')JSTreeObj[numTree].dragNode_noSiblings=true;

            if(thisObj && thisObj.id)
            {
                JSTreeObj[numTree].dragNode_destination = thisObj;
                var img = thisObj.getElementsByTagName('IMG')[1];
                var tmpObj= JSTreeObj[numTree].dropTargetIndicator;
                tmpObj.style.display='block';

                var eventSourceObj = this;
                if(JSTreeObj[numTree].dragNode_noSiblings && eventSourceObj.tagName=='IMG')eventSourceObj = eventSourceObj.nextSibling;

                var tmpImg = tmpObj.getElementsByTagName('IMG')[0];
                if(this.tagName=='A' || JSTreeObj[numTree].dragNode_noSiblings){
                    tmpImg.src = tmpImg.src.replace('ind1','ind2');
                    JSTreeObj[numTree].insertAsSub = true;
                    tmpObj.style.left = (JSTreeObj[numTree].getLeftPos(eventSourceObj) + JSTreeObj[numTree].indicator_offsetX_sub) + 'px';
                }else{
                    tmpImg.src = tmpImg.src.replace('ind2','ind1');
                    JSTreeObj[numTree].insertAsSub = false;
                    tmpObj.style.left = (JSTreeObj[numTree].getLeftPos(eventSourceObj) + JSTreeObj[numTree].indicator_offsetX) + 'px';
                }


                tmpObj.style.top = (JSTreeObj[numTree].getTopPos(thisObj) + JSTreeObj[numTree].indicator_offsetY) + 'px';
            }

            return false;

        }
        ,
        dropDragableNodes:function()
        {
            if(JSTreeObj[numTree].dragDropTimer<10){
                JSTreeObj[numTree].dragDropTimer = -1;
                return;
            }
            var showMessage = false;
            if(JSTreeObj[numTree].dragNode_destination){    // Check depth
                var countUp = JSTreeObj[numTree].dragDropCountLevels(JSTreeObj[numTree].dragNode_destination,'up');
                var countDown = JSTreeObj[numTree].dragDropCountLevels(JSTreeObj[numTree].dragNode_source,'down');
                var countLevels = countUp/1 + countDown/1 + (JSTreeObj[numTree].insertAsSub?1:0);

                if(countLevels>JSTreeObj[numTree].maximumDepth){
                    JSTreeObj[numTree].dragNode_destination = false;
                    showMessage = true;     // Used later down in this function
                }
            }


            if(JSTreeObj[numTree].dragNode_destination){
                if(JSTreeObj[numTree].insertAsSub){
                    var uls = JSTreeObj[numTree].dragNode_destination.getElementsByTagName('UL');
                    if(uls.length>0){
                        ul = uls[0];
                        ul.style.display='block';

                        var lis = ul.getElementsByTagName('LI');

                        if(lis.length>0){    // Sub elements exists - drop dragable node before the first one
                            ul.insertBefore(JSTreeObj[numTree].dragNode_source,lis[0]);
                        }else {    // No sub exists - use the appendChild method - This line should not be executed unless there's something wrong in the HTML, i.e empty <ul>
                            ul.appendChild(JSTreeObj[numTree].dragNode_source);
                        }
                    }else{
                        var ul = document.createElement('UL');
                        ul.style.display='block';
                        JSTreeObj[numTree].dragNode_destination.appendChild(ul);
                        ul.appendChild(JSTreeObj[numTree].dragNode_source);
                    }
                    var img = JSTreeObj[numTree].dragNode_destination.getElementsByTagName('IMG')[0];
                    img.style.visibility='visible';
                    img.src = img.src.replace(JSTreeObj[numTree].plusImage,JSTreeObj[numTree].minusImage);


                }else{
                    if(JSTreeObj[numTree].dragNode_destination.nextSibling){
                        var nextSib = JSTreeObj[numTree].dragNode_destination.nextSibling;
                        nextSib.parentNode.insertBefore(JSTreeObj[numTree].dragNode_source,nextSib);
                    }else{
                        JSTreeObj[numTree].dragNode_destination.parentNode.appendChild(JSTreeObj[numTree].dragNode_source);
                    }
                }
                /* Clear parent object */
                var tmpObj = JSTreeObj[numTree].dragNode_parent;
                var lis = tmpObj.getElementsByTagName('LI');
                if(lis.length==0){
                    var img = tmpObj.parentNode.getElementsByTagName('IMG')[0];
                    img.style.visibility='hidden';    // Hide [+],[-] icon
                    tmpObj.parentNode.removeChild(tmpObj);
                }

            }else{
                // Putting the item back to it's original location

                if(JSTreeObj[numTree].dragNode_sourceNextSib){
                    JSTreeObj[numTree].dragNode_parent.insertBefore(JSTreeObj[numTree].dragNode_source,JSTreeObj[numTree].dragNode_sourceNextSib);
                }else{
                    JSTreeObj[numTree].dragNode_parent.appendChild(JSTreeObj[numTree].dragNode_source);
                }

            }
            JSTreeObj[numTree].dropTargetIndicator.style.display='none';
            JSTreeObj[numTree].dragDropTimer = -1;
            if(showMessage && JSTreeObj[numTree].messageMaximumDepthReached)alert(JSTreeObj[numTree].messageMaximumDepthReached);
        }
        ,
        createDropIndicator : function()
        {
            this.dropTargetIndicator = document.createElement('DIV');
            this.dropTargetIndicator.style.position = 'absolute';
            this.dropTargetIndicator.style.display='none';
            var img = document.createElement('IMG');
            img.src = this.imageFolder + 'dragDrop_ind1.gif';
            img.id = 'dragDropIndicatorImage';
            this.dropTargetIndicator.appendChild(img);
            document.body.appendChild(this.dropTargetIndicator);

        }
        ,
        dragDropCountLevels : function(obj,direction,stopAtObject){
            var countLevels = 0;
            if(direction=='up'){
                while(obj.parentNode && obj.parentNode!=stopAtObject){
                    obj = obj.parentNode;
                    if(obj.tagName=='UL')countLevels = countLevels/1 +1;
                }
                return countLevels;
            }

            if(direction=='down'){
                var subObjects = obj.getElementsByTagName('LI');
                for(var no=0;no<subObjects.length;no++){
                    countLevels = Math.max(countLevels,JSTreeObj[numTree].dragDropCountLevels(subObjects[no],"up",obj));
                }
                return countLevels;
            }
        }
        ,
        cancelEvent : function()
        {
            return false;
        }
        ,
        cancelSelectionEvent : function()
        {

            if(JSTreeObj[numTree].dragDropTimer<10)return true;
            return false;
        },
        getNodeOrders : function(initObj,saveString)
        {

            if(!saveString)var saveString = '';
            if(!initObj){
                initObj = document.getElementById(this.idOfTree);

            }
            var lis = initObj.getElementsByTagName('LI');

            if(lis.length>0){
                var li = lis[0];
                while(li){
                    if(li.id){
                        if(saveString.length>0)saveString = saveString + ',';
                        var numericID = li.id.replace(/[^0-9]/gi,'');
                        if(numericID.length==0)numericID='A';
                        var numericParentID = li.parentNode.parentNode.id.replace(/[^0-9]/gi,'');
                        if(numericID!='0'){
                            saveString = saveString + numericID;
                            saveString = saveString + '-';


                            if(li.parentNode.id!=this.idOfTree)saveString = saveString + numericParentID; else saveString = saveString + '0';
                        }
                        var ul = li.getElementsByTagName('UL');
                        if(ul.length>0){
                            saveString = this.getNodeOrders(ul[0],saveString);
                        }
                    }
                    li = li.nextSibling;
                }
            }

            if(initObj.id == this.idOfTree){
                return saveString;

            }
            return saveString;
        },
        getVisibleTreeState : function(initObj,saveString)
        {

            if(!saveString)var saveString = '';
            if(!initObj){
                initObj = document.getElementById(this.idOfTree);

            }
            if(initObj.style.display == "none") return saveString; // nothing to do here

            var parentLI = initObj.parentNode;
            if (parentLI.tagName=="LI") {

                if(saveString.length>0)saveString = saveString + ','+parentLI.id;
                else  saveString = parentLI.id;

            }


            var lis = initObj.getElementsByTagName('LI');
            if(lis.length>0){
                var li = lis[0];
                while(li){
                    if(li.id){

                        var ul = li.getElementsByTagName('UL');
                        if(ul.length>0){
                            saveString = this.getVisibleTreeState(ul[0],saveString);
                        }
                    }
                    li = li.nextSibling;
                }
            }

            return saveString;
        },
        highlightItem : function(inputObj,e)
        {
            if(JSTreeObj[numTree].currentlyActiveItem)JSTreeObj[numTree].currentlyActiveItem.className = '';
            this.className = 'highlightedNodeItem';
            JSTreeObj[numTree].currentlyActiveItem = this;
        }
        ,
        removeHighlight : function()
        {
            if(JSTreeObj[numTree].currentlyActiveItem)JSTreeObj[numTree].currentlyActiveItem.className = '';
            JSTreeObj[numTree].currentlyActiveItem = false;
        }
        ,
        hasSubNodes : function(obj)
        {
            var subs = obj.getElementsByTagName('LI');
            if(subs.length>0)return true;
            return false;
        },
        addNewProjectNode : function(parent, proj_id, proj_name) {
            var parentUL = null;
            if(parent.tagName == "A") {
                var parentLI = parent.parentNode;
                var subULs = parentLI.getElementsByTagName('UL');
                if(subULs.length==0) {
                    alert('new child');
                    parentUL = document.createElement('UL');
                }else      parentUL =     subULs[0];
                var newLI = document.createElement('LI');
                newLI.id="li_proj_"+proj_id;
                newLI.iconType="active_proj";
                parentUL.appendChild(newLI);

                var img = document.createElement('IMG');
                img.src = this.imageFolder + this.plusImage;
                img.onclick = JSTreeObj[numTree].showHideNode;
                img.style.visibility='hidden';
                newLI.appendChild(img);

                var folderImg = document.createElement('IMG');
                folderImg.src = this.imageFolder + "active_proj.gif";
                folderImg.onmousedown = JSTreeObj[numTree].initDrag;
                folderImg.onmousemove = JSTreeObj[numTree].moveDragableNodes;

                newLI.appendChild(folderImg);

                var aTag = document.createElement('A');
                aTag.innerHTML = proj_name;
                aTag.id="a_proj_"+proj_id;
                aTag.href="#";
                aTag.onmousedown = JSTreeObj[numTree].initDrag;
                aTag.onmousemove = JSTreeObj[numTree].moveDragableNodes;
                newLI.appendChild(aTag);
                this.contextMenu.attachToElement(aTag,false,null);
                this.addEvent(aTag,'contextmenu',this.highlightItem);
            }

        },
        addNewTagNode : function(proj_menu_obj, tag_id, tag_name) {
            var doShowNode = false;
            var parentUL = null;
            if(proj_menu_obj.tagName == "A") {

                var parentLI = proj_menu_obj.parentNode;
                var subULs = parentLI.getElementsByTagName('UL');
                if(subULs.length==0) {
                    parentUL = document.createElement('UL');
                    parentLI.appendChild(parentUL);
                    var plusImg = parentLI.getElementsByTagName('IMG')[0];
                    plusImg.style.visibility = "visible";
                    doShowNode = true;
                }else      parentUL =     subULs[0];

                var newLI = document.createElement('LI');
                newLI.id="li_tag_"+tag_id;
                newLI.iconType="icon_tag";
                parentUL.appendChild(newLI);

                var img = document.createElement('IMG');
                img.src = this.imageFolder + this.plusImage;
                img.onclick = JSTreeObj[numTree].showHideNode;
                img.style.visibility='hidden';
                newLI.appendChild(img);

                var folderImg = document.createElement('IMG');
                folderImg.src = this.imageFolder + "icon_tag.gif";
                folderImg.onmousedown = JSTreeObj[numTree].initDrag;
                folderImg.onmousemove = JSTreeObj[numTree].moveDragableNodes;
                newLI.appendChild(folderImg);



                var aTag = document.createElement('A');
                aTag.innerHTML = tag_name;
                aTag.id="a_tag_"+tag_id;
                aTag.href="#";
                aTag.onmousedown = JSTreeObj[numTree].initDrag;
                aTag.onmousemove = JSTreeObj[numTree].moveDragableNodes;
                newLI.appendChild(aTag);
                this.contextMenu.attachToElement(aTag,false,null);
                this.addEvent(aTag,'contextmenu',this.highlightItem);

                if(doShowNode) this.showHideNode(false,parentLI.id);

            }
        },
        createNewProject : function(obj1,obj2)
        {
            __currentPMT_menu_obj = obj2;
            showDialogBox("dialog_create_new_project",300,130);


        },
        reOrderProjects : function(obj1,obj2)
        {
            showDialogBox("dialog_reorder_projects",300,130);

        },
        editProjectLog : function(obj1,obj2)
        {
            if(obj2.tagName == "A") {
                var proj_name = obj2.text;
                var proj_id = obj2.parentNode.id;
                if(proj_id.indexOf("li_proj_")==0) {
                    proj_id = proj_id.substr(8);
                }
                openEditProjectLogDialog(proj_id,proj_name);
            }

        },
        changeProjectStatus : function(obj1,obj2)
        {
            if(obj2.tagName == "A") {
                __cur_proj_obj_id = obj2.parentNode;
                __cur_proj_edit_name = obj2.text;
                var proj_id = obj2.parentNode.id;
                if(proj_id.indexOf("li_proj_")==0) {
                    __cur_proj_edit_id = proj_id.substr(8);
                }
                showDialogBox("dialog_change_project_status",300,130);
            }
        },
        createNewTag : function(obj1,obj2)
        {
            __currentPMT_menu_obj = obj2;
            showDialogBox("dialog_create_new_tag",300,260);

        },
        associateExistingTag : function (obj1,obj2) {
            __currentPMT_menu_obj = obj2;
            ___current_Vis_List = this.getVisibleTreeState();
            openAccTagWithProjDialog();

        },
        renameProject  : function(obj1,obj2)
        {
            __currentPMT_menu_obj = obj2;
            showDialogBox("dialog_rename_project",300,130);
        },
        deleteProject : function(obj1,obj2)
        {
            ___current_Vis_List = this.getVisibleTreeState();
//            this.collapseAll();
//            this.expandList(list);
//            var message = 'Click OK to delete project';
//            confirm(message);
            __currentPMT_menu_obj = obj2;
            showDialogBox("dialog_delete_project",300,150);

        },
        renameTag : function (obj1,obj2) {
            __currentPMT_menu_obj = obj2;
            showDialogBox("dialog_rename_tag",300,130);
        },
        editTagDescription : function (obj1,obj2) {
            if(obj2.tagName == "A") {
                var tag_name = obj2.text;
                var tag_id = obj2.parentNode.id;
                if(tag_id.indexOf("li_tag_")==0) {
                    tag_id = tag_id.substr(7);
                }
                openEditTagDescriptionDialog(tag_id,tag_name);
            }

        },
        doAnalyzeCluster : function (obj1,obj2) {
            if(obj2.tagName == "A") {
                var tag_name = obj2.text;
                var tag_id = obj2.parentNode.id;
                if(tag_id.indexOf("li_res_")==0) {
                    tag_id = tag_id.substr(7);
                }
                openPatentInAnalyzeTab(tag_id);
            }
        },
        deleteItem : function(obj1,obj2)
        {
            var message = 'Click OK to delete item ' + obj2.innerHTML;
            if(this.hasSubNodes(obj2.parentNode)) message = message + ' and it\'s sub nodes';
            if(confirm(message)){
                this.__deleteItem_step2(obj2.parentNode);    // Sending <LI> tag to the __deleteItem_step2 method
            }

        }
        ,
        __refreshDisplay : function(obj)
        {
            if(this.hasSubNodes(obj))return;

            var img = obj.getElementsByTagName('IMG')[0];
            img.style.visibility = 'hidden';
        }
        ,
        __deleteItem_step2 : function(obj)
        {

            var saveString = obj.id.replace(/[^0-9]/gi,'');

            var lis = obj.getElementsByTagName('LI');
            for(var no=0;no<lis.length;no++){
                saveString = saveString + ',' + lis[no].id.replace(/[^0-9]/gi,'');
            }

            // Creating ajax object and send items
            var ajaxIndex = JSTreeObj[numTree].ajaxObjects.length;
            JSTreeObj[numTree].ajaxObjects[ajaxIndex] = new sack();
            JSTreeObj[numTree].ajaxObjects[ajaxIndex].method = "GET";
            JSTreeObj[numTree].ajaxObjects[ajaxIndex].setVar("deleteIds", saveString);
            JSTreeObj[numTree].__addAdditionalRequestParameters(JSTreeObj[numTree].ajaxObjects[ajaxIndex], JSTreeObj[numTree].additionalDeleteRequestParameters);
            JSTreeObj[numTree].ajaxObjects[ajaxIndex].requestFile = JSTreeObj[numTree].filePathDeleteItem;    // Specifying which file to get
            JSTreeObj[numTree].ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj[numTree].__deleteComplete(ajaxIndex,obj); } ;    // Specify function that will be executed after file has been found
            JSTreeObj[numTree].ajaxObjects[ajaxIndex].runAJAX();        // Execute AJAX function


        }
        ,
        __deleteComplete : function(ajaxIndex,obj)
        {
            if(this.ajaxObjects[ajaxIndex].response!='OK'){
                alert('ERROR WHEN TRYING TO DELETE NODE: ' + this.ajaxObjects[ajaxIndex].response);     // Rename failed
            }else{
                var parentRef = obj.parentNode.parentNode;
                obj.parentNode.removeChild(obj);
                this.__refreshDisplay(parentRef);

            }

        }
        ,
        __renameComplete : function(ajaxIndex)
        {
            if(this.ajaxObjects[ajaxIndex].response!='OK'){
                alert('ERROR WHEN TRYING TO RENAME NODE: ' + this.ajaxObjects[ajaxIndex].response);     // Rename failed
            }
        }
        ,
        __saveTextBoxChanges : function(e,inputObj)
        {
            if(!inputObj && this)inputObj = this;
            if(document.all)e = event;
            if(e.keyCode && e.keyCode==27){
                JSTreeObj[numTree].__cancelRename(e,inputObj);
                return;
            }
            inputObj.style.display='none';
            inputObj.nextSibling.style.visibility='visible';
            if(inputObj.value.length>0){
                inputObj.nextSibling.innerHTML = inputObj.value;
                // Send changes to the server.
                if (JSTreeObj[numTree].renameState != JSTreeObj[numTree].RENAME_STATE_BEGIN) {
                    return;
                }
                JSTreeObj[numTree].renameState = JSTreeObj[numTree].RENAME_STATE_REQUEST_SENDED;

                var ajaxIndex = JSTreeObj[numTree].ajaxObjects.length;
                JSTreeObj[numTree].ajaxObjects[ajaxIndex] = new sack();
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].method = "GET";
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].setVar("renameId", inputObj.parentNode.id.replace(/[^0-9]/gi,''));
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].setVar("newName", inputObj.value);
                JSTreeObj[numTree].__addAdditionalRequestParameters(JSTreeObj[numTree].ajaxObjects[ajaxIndex], JSTreeObj[numTree].additionalRenameRequestParameters);
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].requestFile = JSTreeObj[numTree].filePathRenameItem;    // Specifying which file to get
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj[numTree].__renameComplete(ajaxIndex); } ;    // Specify function that will be executed after file has been found
                JSTreeObj[numTree].ajaxObjects[ajaxIndex].runAJAX();        // Execute AJAX function



            }
        }
        ,
        __cancelRename : function(e,inputObj)
        {
            JSTreeObj[numTree].renameState = JSTreeObj[numTree].RENAME_STATE_CANCELD;
            if(!inputObj && this)inputObj = this;
            inputObj.value = JSTreeObj[numTree].helpObj.innerHTML;
            inputObj.nextSibling.innerHTML = JSTreeObj[numTree].helpObj.innerHTML;
            inputObj.style.display = 'none';
            inputObj.nextSibling.style.visibility = 'visible';
        }
        ,
        __renameCheckKeyCode : function(e)
        {
            if(document.all)e = event;
            if(e.keyCode==13){    // Enter pressed
                JSTreeObj[numTree].__saveTextBoxChanges(false,this);
            }
            if(e.keyCode==27){    // ESC pressed
                JSTreeObj[numTree].__cancelRename(false,this);
            }
        }
        ,
        __createTextBox : function(obj)
        {
            var textBox = document.createElement('INPUT');
            textBox.className = 'folderTreeTextBox';
            textBox.value = obj.innerHTML;
            obj.parentNode.insertBefore(textBox,obj);
            textBox.id = 'textBox' + obj.parentNode.id.replace(/[^0-9]/gi,'');
            textBox.onblur = this.__saveTextBoxChanges;
            textBox.onkeydown = this.__renameCheckKeyCode;
            this.__renameEnableTextBox(obj);
        }
        ,
        __renameEnableTextBox : function(obj)
        {
            JSTreeObj[numTree].renameState = JSTreeObj[numTree].RENAME_STATE_BEGIN;
            obj.style.visibility = 'hidden';
            obj.previousSibling.value = obj.innerHTML;
            obj.previousSibling.style.display = 'inline';
            obj.previousSibling.select();
        }
        ,
        renameItem : function(obj1,obj2)
        {
            currentItemToEdit = obj2.parentNode;    // Reference to the <li> tag.
            if(!obj2.previousSibling || obj2.previousSibling.tagName.toLowerCase()!='input'){
                this.__createTextBox(obj2);
            }else{
                this.__renameEnableTextBox(obj2);
            }
            this.helpObj.innerHTML = obj2.innerHTML;

        },
        clickHandler : function(inputObj,e) {

            var tag_id = null;
            var tag_obj = null;
            if (inputObj.target) tag_obj = inputObj.target;
            else    tag_obj = inputObj.srcElement;
            tag_id = tag_obj.id;

            if(tag_id.indexOf("a_res_") == 0) {
                var pat_num = tag_id.substr(6);
                showDocInfoInClusterTree(tag_obj,pat_num);
                return false;
            }
        }
        ,
        initTree : function()
        {            treeUlCounter = 0;            numTree++;
            JSTreeObj[numTree] = this;
            JSTreeObj[numTree].createDropIndicator();
            
            /*
            document.documentElement.onselectstart = JSTreeObj[numTree].cancelSelectionEvent;
            document.documentElement.ondragstart = JSTreeObj[numTree].cancelEvent;
            document.documentElement.onmousedown = JSTreeObj[numTree].removeHighlight;*/

            /* Creating help object for storage of values */
            this.helpObj = document.createElement('DIV');
            this.helpObj.style.display = 'none';
            document.body.appendChild(this.helpObj);
            
            
            /* Create context menu */
            if(this.deleteAllowed || this.renameAllowed || this.contextMenuAllowed){
//                try{
                    /* Creating menu model for the context menu, i.e. the datasource */

                    this.contextMenu = new DHTMLGoodies_contextMenu();
                    this.contextMenu.setWidth(120);


                    var menuContextChoice = new DHTMLGoodies_menuModel();
                    menuContextChoice.init();


                    var menuModel = new DHTMLGoodies_menuModel();
                    if(this.deleteAllowed)menuModel.addItem(1,'Delete','','',false,"JSTreeObj"+"["+num+"]"+".deleteItem");
                    if(this.renameAllowed)menuModel.addItem(2,'Rename','','',false,"JSTreeObj"+"["+num+"]"+".renameItem");
                    menuModel.init();

                    var menuModelRenameOnly = new DHTMLGoodies_menuModel();
                    if(this.renameAllowed)menuModelRenameOnly.addItem(3,'Rename','','',false,'JSTreeObj['+num+'].renameItem');
                    menuModelRenameOnly.init();

                    var menuModelDeleteOnly = new DHTMLGoodies_menuModel();
                    if(this.deleteAllowed)menuModelDeleteOnly.addItem(4,'Delete','','',false,'JSTreeObj['+num+'].deleteItem');
                    menuModelDeleteOnly.init();

                    var rootMenuModel = new DHTMLGoodies_menuModel();
                    rootMenuModel.addItem(5,'Create new project','','',false,'JSTreeObj['+num+'].createNewProject');
                    rootMenuModel.addItem(6,'Re-order projects','','',false,'JSTreeObj['+num+'].reOrderProjects');
                    rootMenuModel.init();
                    this.contextMenu.addMenuModel("my_projects",rootMenuModel);

                    var projMenuModel = new DHTMLGoodies_menuModel();
                    projMenuModel.addItem(7,'Edit project log','','',false,'JSTreeObj['+num+'].editProjectLog');
                    projMenuModel.addItem(8,'Change project status','','',false,'JSTreeObj['+num+'].changeProjectStatus');
                    projMenuModel.addItem(9,'Create new tag','','',false,'JSTreeObj['+num+'].createNewTag');
                    projMenuModel.addItem(10,'Associate existing tag','','',false,'JSTreeObj['+num+'].associateExistingTag');
                    projMenuModel.addItem(11,'Rename Project','','',false,'JSTreeObj['+num+'].renameProject');
                    projMenuModel.addItem(12,'Delete Project','','',false,'JSTreeObj['+num+'].deleteProject');
                    projMenuModel.init();
                    this.contextMenu.addMenuModel("a_proj",projMenuModel);


                    var tagMenuModel = new DHTMLGoodies_menuModel();
                    tagMenuModel.addItem(13,'Rename tag','','',false,'JSTreeObj['+num+'].renameTag');
                    tagMenuModel.addItem(14,'Edit tag description','','',false,'JSTreeObj['+num+'].editTagDescription');
                    tagMenuModel.addItem(15,'Diassociate tag from this project','','',false,'JSTreeObj['+num+'].diassociateTagFromProject');
                    tagMenuModel.addItem(16,'Delete tag','','',false,'JSTreeObj['+num+'].deleteTag');
                    tagMenuModel.init();
                    this.contextMenu.addMenuModel("a_tag",tagMenuModel);



                    var notclsProjMenuModel = new DHTMLGoodies_menuModel();
                    notclsProjMenuModel.addItem(17,'Edit project log','','',false,'JSTreeObj['+num+'].editProjectLog');
                    notclsProjMenuModel.addItem(18,'Create new tag','','',false,'JSTreeObj['+num+'].createNewTag');
                    notclsProjMenuModel.addItem(19,'Rename Project','','',false,'JSTreeObj'+num+'.renameProject');
                    notclsProjMenuModel.init();
                    this.contextMenu.addMenuModel("a_proj_notcls",notclsProjMenuModel);


                    var patClusterMenuModel = new DHTMLGoodies_menuModel();
                    patClusterMenuModel.addItem(20,'Analyze','','',false,'clusterTree.doAnalyzeCluster');
                    patClusterMenuModel.addItem(21,'Add to Project','','',false,'clusterTree.addToProjectFromCluster');
                    patClusterMenuModel.init();
                    this.contextMenu.addMenuModel("a_clustered_patent",patClusterMenuModel);



                    window.refToDragDropTree = this;

                    referenceToDHTMLSuiteContextMenu = this.contextMenu;
//                }catch(e){

//                }
            }


            var nodeId = 0;
            var dhtmlgoodies_tree = document.getElementById(this.idOfTree);
            var menuItems = dhtmlgoodies_tree.getElementsByTagName('LI');    // Get an array of all menu items
            for(var no=0;no<menuItems.length;no++){
                // No children var set ?
                var noChildren = false;
                var tmpVar = menuItems[no].getAttribute('noChildren');
                if(!tmpVar)tmpVar = menuItems[no].noChildren;
                if(tmpVar=='true')noChildren=true;
                // No drag var set ?
                var noDrag = false;
                var tmpVar = menuItems[no].getAttribute('noDrag');
                if(!tmpVar)tmpVar = menuItems[no].noDrag;
                if(tmpVar=='true')noDrag=true;

                nodeId++;
                var subItems = menuItems[no].getElementsByTagName('UL');
                var img = document.createElement('IMG');
                img.src = this.imageFolder + this.plusImage;
                img.onclick = JSTreeObj[numTree].showHideNode;

                if(subItems.length==0)img.style.visibility='hidden';else{
                    subItems[0].id = 'tree_ul_' +num +'_'+ treeUlCounter;
					treeUlCounter++;
                }
                var aTag = menuItems[no].getElementsByTagName('A')[0];
                if(aTag.id == "")    aTag.id = 'nodeATag' + menuItems[no].id.replace(/[^0-9]/gi,'');
                //aTag.onclick = JSTreeObj.showHideNode;
                if(!noDrag)aTag.onmousedown = JSTreeObj[numTree].initDrag;
                if(!noChildren)aTag.onmousemove = JSTreeObj[numTree].moveDragableNodes;
                menuItems[no].insertBefore(img,aTag);
                //menuItems[no].id = 'dhtmlgoodies_treeNode' + nodeId;
                var folderImg = document.createElement('IMG');
                if(!noDrag)folderImg.onmousedown = JSTreeObj[numTree].initDrag;
                folderImg.onmousemove = JSTreeObj[numTree].moveDragableNodes;
                var iconType = menuItems[no].getAttribute('iconType');
                if(iconType){
                    folderImg.src = this.imageFolder + iconType+".gif";
                }else{
                    folderImg.src = this.imageFolder + this.folderImage;
                }
                menuItems[no].insertBefore(folderImg,aTag);

                if(this.contextMenu){

                    this.contextMenu.attachToElement(aTag,false,null);

//                    var rootMenu = menuItems[no].getAttribute('rootMenu');
//                    if(rootMenu=="true") {
//                        this.contextMenu.attachToElement(aTag,false,rootMenuModel);

//                    } else {
//                        var noDelete = menuItems[no].getAttribute('noDelete');
//                        if(!noDelete)noDelete = menuItems[no].noDelete;
//                        var noRename = menuItems[no].getAttribute('noRename');
//                        if(!noRename)noRename = menuItems[no].noRename;
  //
//                        if(noRename=='true' && noDelete=='true'){
//                            this.contextMenu.attachToElement(aTag,false,menuContextChoice)
//                        }else{
//                            if(noDelete == 'true')this.contextMenu.attachToElement(aTag,false,menuModelRenameOnly);
//                            else if(noRename == 'true')this.contextMenu.attachToElement(aTag,false,menuModelDeleteOnly);
//                            else this.contextMenu.attachToElement(aTag,false,menuModel);
//
//                        }
//                    }
                }
                this.addEvent(aTag,'contextmenu',this.highlightItem);
                this.addEvent(aTag,'click',this.clickHandler);



            }



            initExpandedNodes = this.Get_Cookie('dhtmlgoodies_expandedNodes');
            if(initExpandedNodes){
                var nodes = initExpandedNodes.split(',');
                for(var no=0;no<nodes.length;no++){
                    if(nodes[no])this.showHideNode(false,nodes[no]);
                }
            }


            document.documentElement.onmousemove = JSTreeObj[numTree].moveDragableNodes;
            document.documentElement.onmouseup = JSTreeObj[numTree].dropDragableNodes;
        }
        ,
        __addAdditionalRequestParameters : function(ajax, parameters)
        {
            for (var parameter in parameters) {
                ajax.setVar(parameter, parameters[parameter]);
            }
        }
    }