1 /************************************************************************************************************
2 Drag and drop folder tree
3 Copyright (C) 2006 DTHMLGoodies.com, Alf Magne Kalleland
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
20 written by Alf Magne Kalleland.
22 Alf Magne Kalleland, 2006
23 Owner of DHTMLgoodies.com
26 ************************************************************************************************************/
29 var treeUlCounter = 0;
33 function JSDragDropTree()
43 var dragNode_sourceNextSib;
44 var dragNode_noSiblings;
47 var dragNode_destination;
48 var floatingContainer;
50 var dropTargetIndicator;
52 var indicator_offsetX;
53 var indicator_offsetX_sub;
54 var indicator_offsetY;
56 this.imageFolder = imgFolder+'tree/';
57 this.folderImage = 'dhtmlgoodies_folder.gif';
58 this.plusImage = 'dhtmlgoodies_plus.gif';
59 this.minusImage = 'dhtmlgoodies_minus.gif';
60 this.maximumDepth = 6;
61 var messageMaximumDepthReached;
62 var messageNoRightsOnFolder;
63 var filePathRenameItem;
64 var filePathDeleteItem;
65 var additionalRenameRequestParameters = {};
66 var additionalDeleteRequestParameters = {};
71 var currentlyActiveItem;
73 var currentItemToEdit; // Reference to item currently being edited(example: renamed)
74 var selectedItem; // ADDED BY FARHAN
77 this.contextMenu = false;
78 this.floatingContainer = document.createElement('UL');
79 this.floatingContainer.style.position = 'absolute';
80 this.floatingContainer.style.display='none';
81 this.floatingContainer.id = 'floatingContainer';
82 this.insertAsSub = false;
83 document.body.appendChild(this.floatingContainer);
84 this.dragDropTimer = -1;
85 this.dragNode_noSiblings = false;
86 this.currentItemToEdit = false;
89 this.indicator_offsetX = 2; // Offset position of small black lines indicating where nodes would be dropped.
90 this.indicator_offsetX_sub = 4;
91 this.indicator_offsetY = 2;
93 this.indicator_offsetX = 1; // Offset position of small black lines indicating where nodes would be dropped.
94 this.indicator_offsetX_sub = 3;
95 this.indicator_offsetY = 2;
97 if(navigator.userAgent.indexOf('Opera')>=0){
98 this.indicator_offsetX = 2; // Offset position of small black lines indicating where nodes would be dropped.
99 this.indicator_offsetX_sub = 3;
100 this.indicator_offsetY = -7;
103 this.messageMaximumDepthReached = ''; // Use '' if you don't want to display a message
104 this.messageNoRightsOnFolder = 'You do not have access to this folder';
106 this.renameAllowed = true;
107 this.deleteAllowed = true;
108 this.addAllowed = true;
109 this.currentlyActiveItem = false;
110 this.filePathRenameItem = 'folderTree_updateItem.php';
111 this.filePathDeleteItem = 'tree';
112 this.ajaxObjects = new Array();
113 this.helpObj = false;
115 this.RENAME_STATE_BEGIN = 1;
116 this.RENAME_STATE_CANCELED = 2;
117 this.RENAME_STATE_REQUEST_SENDED = 3;
118 this.renameState = null;
122 /* JSDragDropTree class */
123 JSDragDropTree.prototype = {
127 * This function adds an event listener to an element on the page.
129 * @param Object whichObject = Reference to HTML element(Which object to assigne the event)
130 * @param String eventType = Which type of event, example "mousemove" or "mouseup"
131 * @param functionName = Name of function to execute.
135 addEvent : function(whichObject,eventType,functionName)
137 if(whichObject.attachEvent){
138 whichObject['e'+eventType+functionName] = functionName;
139 whichObject[eventType+functionName] = function(){whichObject['e'+eventType+functionName]( window.event );}
140 whichObject.attachEvent( 'on'+eventType, whichObject[eventType+functionName] );
142 whichObject.addEventListener(eventType,functionName,false);
149 * This function removes an event listener from an element on the page.
151 * @param Object whichObject = Reference to HTML element(Which object to assigne the event)
152 * @param String eventType = Which type of event, example "mousemove" or "mouseup"
153 * @param functionName = Name of function to execute.
157 removeEvent : function(whichObject,eventType,functionName)
159 if(whichObject.detachEvent){
160 whichObject.detachEvent('on'+eventType, whichObject[eventType+functionName]);
161 whichObject[eventType+functionName] = null;
163 whichObject.removeEventListener(eventType,functionName,false);
166 Get_Cookie : function(name) {
167 var start = document.cookie.indexOf(name+"=");
168 var len = start+name.length+1;
169 if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
170 if (start == -1) return null;
171 var end = document.cookie.indexOf(";",len);
172 if (end == -1) end = document.cookie.length;
173 return unescape(document.cookie.substring(len,end));
176 // This function has been slightly modified
177 Set_Cookie : function(name,value,expires,path,domain,secure) {
178 expires = expires * 60*60*24*1000;
179 var today = new Date();
180 var expires_date = new Date( today.getTime() + (expires) );
181 var cookieString = name + "=" +escape(value) +
182 ( (expires) ? ";expires=" + expires_date.toGMTString() : "") +
183 ( (path) ? ";path=" + path : "") +
184 ( (domain) ? ";domain=" + domain : "") +
185 ( (secure) ? ";secure" : "");
186 document.cookie = cookieString;
189 setFileNameRename : function(newFileName)
191 this.filePathRenameItem = newFileName;
194 setFileNameDelete : function(newFileName)
196 this.filePathDeleteItem = newFileName;
199 setAdditionalRenameRequestParameters : function(requestParameters)
201 this.additionalRenameRequestParameters = requestParameters;
204 setAdditionalDeleteRequestParameters : function(requestParameters)
206 this.additionalDeleteRequestParameters = requestParameters;
208 ,setRenameAllowed : function(renameAllowed)
210 this.renameAllowed = renameAllowed;
213 setDeleteAllowed : function(deleteAllowed)
215 this.deleteAllowed = deleteAllowed;
218 setAddAllowed : function(addAllowed)
220 this.addAllowed = addAllowed;
222 ,setMaximumDepth : function(maxDepth)
224 this.maximumDepth = maxDepth;
226 ,setMessageMaximumDepthReached : function(newMessage)
228 this.messageMaximumDepthReached = newMessage;
231 setImageFolder : function(path)
233 this.imageFolder = path;
236 setFolderImage : function(imagePath)
238 this.folderImage = imagePath;
241 setPlusImage : function(imagePath)
243 this.plusImage = imagePath;
246 setMinusImage : function(imagePath)
248 this.minusImage = imagePath;
251 setTreeId : function(idOfTree)
253 this.idOfTree = idOfTree;
256 expandAll : function()
258 var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');
259 for(var no=0;no<menuItems.length;no++){
260 var subItems = menuItems[no].getElementsByTagName('UL');
261 if(subItems.length>0 && subItems[0].style.display!='block'){
262 JSTreeObj.showHideNode(false,menuItems[no].id);
267 collapseAll : function()
269 var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');
270 for(var no=0;no<menuItems.length;no++){
271 var subItems = menuItems[no].getElementsByTagName('UL');
272 if(subItems.length>0 && subItems[0].style.display=='block'){
273 JSTreeObj.showHideNode(false,menuItems[no].id);
276 JSTreeObj.showHideNode(false,menuItems[0].id);
280 Find top pos of a tree node
282 getTopPos : function(obj){
283 var top = obj.offsetTop/1;
284 while((obj = obj.offsetParent) != null){
285 if(obj.tagName!='HTML')top += obj.offsetTop;
287 if(document.all)top = top/1 + 13; else top = top/1 + 4;
292 Find left pos of a tree node
294 getLeftPos : function(obj){
295 var left = obj.offsetLeft/1 + 1;
296 while((obj = obj.offsetParent) != null){
297 if(obj.tagName!='HTML')left += obj.offsetLeft;
300 if(document.all)left = left/1 - 2;
305 showHideNode : function(e,inputId)
308 if(!document.getElementById(inputId))return;
309 thisNode = document.getElementById(inputId).getElementsByTagName('IMG')[0];
312 if(this.tagName=='A')thisNode = this.parentNode.getElementsByTagName('IMG')[0];
315 if(thisNode.style.visibility=='hidden')return;
316 var parentNode = thisNode.parentNode;
317 inputId = parentNode.id.replace(/[^0-9]/g,'');
318 if(thisNode.src.indexOf(JSTreeObj.plusImage)>=0){
319 thisNode.src = thisNode.src.replace(JSTreeObj.plusImage,JSTreeObj.minusImage);
320 var ul = parentNode.getElementsByTagName('UL')[0];
321 ul.style.display='block';
322 if(!initExpandedNodes)initExpandedNodes = ',';
323 if(initExpandedNodes.indexOf(',' + inputId + ',')<0) initExpandedNodes = initExpandedNodes + inputId + ',';
325 thisNode.src = thisNode.src.replace(JSTreeObj.minusImage,JSTreeObj.plusImage);
326 parentNode.getElementsByTagName('UL')[0].style.display='none';
327 initExpandedNodes = initExpandedNodes.replace(',' + inputId,'');
329 JSTreeObj.Set_Cookie('dhtmlgoodies_expandedNodes',initExpandedNodes,500);
333 /*expand only the selected node*/
334 showSelectedNode : function(selectedItemId)
336 var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI'); // Get an array of all menu items
339 for(var no=0;no<menuItems.length;no++){
340 if (selectedItemId != null && selectedItemId == menuItems[no].id.replace(/[^0-9]/gi,'')){
341 selectedNode = menuItems[no];
346 if (selectedNode != null){
347 var subItems = selectedNode.getElementsByTagName('UL');
348 if(subItems && subItems.length>0 && subItems[0].style.display!='block'){
349 JSTreeObj.showHideNode(false,selectedNode.id);
351 selectedNode = selectedNode.parentNode;
353 }while (selectedNode && selectedNode.id.replace(/[^0-9]/gi,'') != '0');
357 isDeleteAllowed : function(selectedItemId)
359 var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI'); // Get an array of all menu items
362 for(var no=0;no<menuItems.length;no++){
363 if (selectedItemId != null && selectedItemId == menuItems[no].id.replace(/[^0-9]/gi,'')){
364 selectedNode = menuItems[no];
368 if (selectedNode && selectedNode.getAttribute('noDelete') && selectedNode.getAttribute('noDelete') == 'true')
375 isAddAllowed : function(selectedItemId)
377 var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI'); // Get an array of all menu items
380 for(var no=0;no<menuItems.length;no++){
381 if (selectedItemId != null && selectedItemId == menuItems[no].id.replace(/[^0-9]/gi,'')){
382 selectedNode = menuItems[no];
386 if (selectedNode && selectedNode.getAttribute('noChild') && selectedNode.getAttribute('noChild') == 'true')
393 /* Initialize drag */
394 initDrag : function(e)
396 if(document.all)e = event;
398 var subs = JSTreeObj.floatingContainer.getElementsByTagName('LI');
400 if(JSTreeObj.dragNode_sourceNextSib){
401 JSTreeObj.dragNode_parent.insertBefore(JSTreeObj.dragNode_source,JSTreeObj.dragNode_sourceNextSib);
403 JSTreeObj.dragNode_parent.appendChild(JSTreeObj.dragNode_source);
407 JSTreeObj.dragNode_source = this.parentNode;
408 JSTreeObj.dragNode_parent = this.parentNode.parentNode;
409 JSTreeObj.dragNode_sourceNextSib = false;
412 if(JSTreeObj.dragNode_source.nextSibling)JSTreeObj.dragNode_sourceNextSib = JSTreeObj.dragNode_source.nextSibling;
413 JSTreeObj.dragNode_destination = false;
414 JSTreeObj.dragDropTimer = 0;
415 JSTreeObj.timerDrag();
419 timerDrag : function()
421 if(this.dragDropTimer>=0 && this.dragDropTimer<10){
422 this.dragDropTimer = this.dragDropTimer + 1;
423 setTimeout('JSTreeObj.timerDrag()',20);
426 if(this.dragDropTimer==10)
428 JSTreeObj.floatingContainer.style.display='block';
429 JSTreeObj.floatingContainer.appendChild(JSTreeObj.dragNode_source);
433 moveDragableNodes : function(e)
435 if(JSTreeObj.dragDropTimer<10)return;
436 if(document.all)e = event;
437 dragDrop_x = e.clientX/1 + 5 + document.body.scrollLeft;
438 dragDrop_y = e.clientY/1 + 5 + document.documentElement.scrollTop;
440 JSTreeObj.floatingContainer.style.left = dragDrop_x + 'px';
441 JSTreeObj.floatingContainer.style.top = dragDrop_y + 'px';
444 if(thisObj.tagName=='A' || thisObj.tagName=='IMG')thisObj = thisObj.parentNode;
446 JSTreeObj.dragNode_noSiblings = false;
447 var tmpVar = thisObj.getAttribute('noSiblings');
448 if(!tmpVar)tmpVar = thisObj.noSiblings;
449 if(tmpVar=='true')JSTreeObj.dragNode_noSiblings=true;
451 if(thisObj && thisObj.id)
453 JSTreeObj.dragNode_destination = thisObj;
454 var img = thisObj.getElementsByTagName('IMG')[1];
455 var tmpObj= JSTreeObj.dropTargetIndicator;
456 tmpObj.style.display='block';
458 var eventSourceObj = this;
459 if(JSTreeObj.dragNode_noSiblings && eventSourceObj.tagName=='IMG')eventSourceObj = eventSourceObj.nextSibling;
461 var tmpImg = tmpObj.getElementsByTagName('IMG')[0];
462 if(this.tagName=='A' || JSTreeObj.dragNode_noSiblings){
463 tmpImg.src = tmpImg.src.replace('ind1','ind2');
464 JSTreeObj.insertAsSub = true;
465 tmpObj.style.left = (JSTreeObj.getLeftPos(eventSourceObj) + JSTreeObj.indicator_offsetX_sub) + 'px';
467 tmpImg.src = tmpImg.src.replace('ind2','ind1');
468 JSTreeObj.insertAsSub = false;
469 tmpObj.style.left = (JSTreeObj.getLeftPos(eventSourceObj) + JSTreeObj.indicator_offsetX) + 'px';
472 tmpObj.style.top = (JSTreeObj.getTopPos(thisObj) + JSTreeObj.indicator_offsetY) - document.getElementById("scrollableTable").scrollTop + 'px' ;
476 var divHeight = document.getElementById("scrollableTable").style.height;
477 divHeight = divHeight.substring(0, divHeight.indexOf("px"));
478 if (dragDrop_y - JSTreeObj.getTopPos(document.getElementById("scrollableTable"))< 50)
479 document.getElementById("scrollableTable").scrollTop = document.getElementById("scrollableTable").scrollTop - 5;
480 else if (dragDrop_y - JSTreeObj.getTopPos(document.getElementById("scrollableTable")) > divHeight - 50)
481 document.getElementById("scrollableTable").scrollTop = document.getElementById("scrollableTable").scrollTop + 5;
487 dropDragableNodes:function()
489 if(JSTreeObj.dragDropTimer<10){
490 JSTreeObj.dragDropTimer = -1;
493 var showMessage = false;
495 if(JSTreeObj.dragNode_destination){ // Check depth
496 var countUp = JSTreeObj.dragDropCountLevels(JSTreeObj.dragNode_destination,'up');
497 var countDown = JSTreeObj.dragDropCountLevels(JSTreeObj.dragNode_source,'down');
498 var countLevels = countUp/1 + countDown/1 + (JSTreeObj.insertAsSub?1:0);
500 if(countLevels>JSTreeObj.maximumDepth){
501 JSTreeObj.dragNode_destination = false;
502 showMessage = true; // Used later down in this function
503 message = JSTreeObj.messageMaximumDepthReachedl
506 if (JSTreeObj.dragNode_destination && JSTreeObj.dragNode_destination.getAttribute('noDrop') == 'true'){
507 JSTreeObj.dragNode_destination = false;
508 showMessage = true; // Used later down in this function
509 message = JSTreeObj.messageNoRightsOnFolder;
513 if(JSTreeObj.dragNode_destination){
515 if(JSTreeObj.insertAsSub){
516 var uls = JSTreeObj.dragNode_destination.getElementsByTagName('UL');
519 ul.style.display='block';
521 var lis = ul.getElementsByTagName('LI');
523 if(lis.length>0){ // Sub elements exists - drop dragable node before the first one
524 ul.insertBefore(JSTreeObj.dragNode_source,lis[0]);
525 }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>
526 ul.appendChild(JSTreeObj.dragNode_source);
529 var ul = document.createElement('UL');
530 ul.style.display='block';
531 JSTreeObj.dragNode_destination.appendChild(ul);
532 ul.appendChild(JSTreeObj.dragNode_source);
534 var img = JSTreeObj.dragNode_destination.getElementsByTagName('IMG')[0];
535 img.style.visibility='visible';
536 img.src = img.src.replace(JSTreeObj.plusImage,JSTreeObj.minusImage);
540 if(JSTreeObj.dragNode_destination.nextSibling){
541 var nextSib = JSTreeObj.dragNode_destination.nextSibling;
542 nextSib.parentNode.insertBefore(JSTreeObj.dragNode_source,nextSib);
544 JSTreeObj.dragNode_destination.parentNode.appendChild(JSTreeObj.dragNode_source);
547 /* Clear parent object */
548 var tmpObj = JSTreeObj.dragNode_parent;
549 var lis = tmpObj.getElementsByTagName('LI');
551 var img = tmpObj.parentNode.getElementsByTagName('IMG')[0];
552 img.style.visibility='hidden'; // Hide [+],[-] icon
553 tmpObj.parentNode.removeChild(tmpObj);
557 // Putting the item back to it's original location
559 if(JSTreeObj.dragNode_sourceNextSib){
560 JSTreeObj.dragNode_parent.insertBefore(JSTreeObj.dragNode_source,JSTreeObj.dragNode_sourceNextSib);
562 JSTreeObj.dragNode_parent.appendChild(JSTreeObj.dragNode_source);
566 JSTreeObj.dropTargetIndicator.style.display='none';
567 JSTreeObj.dragDropTimer = -1;
568 if(showMessage && message){ alert(message); return;}
569 //save tree structure
573 createDropIndicator : function()
575 this.dropTargetIndicator = document.createElement('DIV');
576 this.dropTargetIndicator.style.position = 'absolute';
577 this.dropTargetIndicator.style.display='none';
578 var img = document.createElement('IMG');
579 img.src = this.imageFolder + 'dragDrop_ind1.gif';
580 img.id = 'dragDropIndicatorImage';
581 this.dropTargetIndicator.appendChild(img);
582 document.body.appendChild(this.dropTargetIndicator);
586 dragDropCountLevels : function(obj,direction,stopAtObject){
589 while(obj.parentNode && obj.parentNode!=stopAtObject){
590 obj = obj.parentNode;
591 if(obj.tagName=='UL')countLevels = countLevels/1 +1;
596 if(direction=='down'){
597 var subObjects = obj.getElementsByTagName('LI');
598 for(var no=0;no<subObjects.length;no++){
599 countLevels = Math.max(countLevels,JSTreeObj.dragDropCountLevels(subObjects[no],"up",obj));
606 cancelEvent : function()
611 cancelSelectionEvent : function()
614 if(JSTreeObj.dragDropTimer<10)return true;
617 ,getNodeOrders : function(initObj,saveString)
620 if(!saveString)var saveString = '';
622 initObj = document.getElementById(this.idOfTree);
625 var lis = initObj.getElementsByTagName('LI');
631 if(saveString.length>0)saveString = saveString + ',';
632 var numericID = li.id.replace(/[^0-9]/gi,'');
633 if(numericID.length==0)numericID='A';
634 var numericParentID = li.parentNode.parentNode.id.replace(/[^0-9]/gi,'');
636 saveString = saveString + numericID;
637 saveString = saveString + '-';
640 if(li.parentNode.id!=this.idOfTree)saveString = saveString + numericParentID; else saveString = saveString + '0';
642 var ul = li.getElementsByTagName('UL');
644 saveString = this.getNodeOrders(ul[0],saveString);
651 if(initObj.id == this.idOfTree){
657 ,highlightItem : function(inputObj,e)
659 if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
660 this.className = 'highlightedNodeItem';
661 JSTreeObj.currentlyActiveItem = this;
663 ,clickItem : function(inputObj,e)
665 if(JSTreeObj.currentlyActiveItem) JSTreeObj.currentlyActiveItem.className = '';
666 this.className = 'highlightedNodeItem';
667 JSTreeObj.currentlyActiveItem = this;
668 JSTreeObj.selectedItem = this;
670 removeHighlight : function()
672 //if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
673 //JSTreeObj.currentlyActiveItem = false;
676 hasSubNodes : function(obj)
678 var subs = obj.getElementsByTagName('LI');
679 if(subs.length>0)return true;
683 deleteItem : function(obj1,obj2)
685 var message = 'Click OK to delete item ' + obj2.innerHTML;
686 if(this.hasSubNodes(obj2.parentNode)) message = message + ' and it\'s sub nodes';
687 if(confirm(message)){
688 this.__deleteItem_step2(obj2.parentNode); // Sending <LI> tag to the __deleteItem_step2 method
697 addItem : function(obj1,obj2)
699 var message = 'Click OK to Add item ' + obj2.innerHTML;
700 return this.__addItem_step2(obj2.parentNode); // Sending <LI> tag to the __addItem_step2 method
703 createMenuReport : function(obj1,obj2)
705 JSTreeObj.selectedItem = obj2;
709 runMenuReport : function(obj1,obj2)
711 JSTreeObj.selectedItem = obj2;
716 editMenuReport : function(obj1,obj2)
718 JSTreeObj.selectedItem = obj2;
722 deleteMenuReport : function(obj1,obj2)
724 JSTreeObj.selectedItem = obj2;
725 if (confirm("Do you want to delete this report?")){
731 __refreshDisplay : function(obj)
733 if(this.hasSubNodes(obj))return;
735 var img = obj.getElementsByTagName('IMG')[0];
736 img.style.visibility = 'hidden';
739 __deleteItem_step2 : function(obj)
742 var saveString = obj.id.replace(/[^0-9]/gi,'');
744 var lis = obj.getElementsByTagName('LI');
745 for(var no=0;no<lis.length;no++){
746 saveString = saveString + ',' + lis[no].id.replace(/[^0-9]/gi,'');
749 // Creating ajax object and send items
750 var ajaxIndex = JSTreeObj.ajaxObjects.length;
751 JSTreeObj.ajaxObjects[ajaxIndex] = new sack();
752 JSTreeObj.ajaxObjects[ajaxIndex].method = "GET";
753 JSTreeObj.ajaxObjects[ajaxIndex].setVar("deleteIds", saveString);
754 document.all.deleteIds.value=saveString;
755 JSTreeObj.__addAdditionalRequestParameters(JSTreeObj.ajaxObjects[ajaxIndex], JSTreeObj.additionalDeleteRequestParameters);
756 JSTreeObj.ajaxObjects[ajaxIndex].requestFile = JSTreeObj.filePathDeleteItem; // Specifying which file to get
757 JSTreeObj.ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj.__deleteComplete(ajaxIndex,obj); } ; // Specify function that will be executed after file has been found
758 //JSTreeObj.ajaxObjects[ajaxIndex].runAJAX(); // Execute AJAX function
759 deleteMyTree_byForm();
764 __addItem_step2 : function(obj)
766 var parentId = obj.id.replace(/[^0-9]/gi,'');
767 document.all.newName.value="";
768 document.all.saveString.value=parentId;
769 if (selectedFolderId)
770 selectedFolderId = parentId;
776 __deleteComplete : function(ajaxIndex,obj)
778 if(this.ajaxObjects[ajaxIndex].response!='OK'){
779 alert('ERROR WHEN TRYING TO DELETE NODE: ' + this.ajaxObjects[ajaxIndex].response); // Rename failed
781 var parentRef = obj.parentNode.parentNode;
782 obj.parentNode.removeChild(obj);
783 this.__refreshDisplay(parentRef);
789 __renameComplete : function(ajaxIndex)
791 if(this.ajaxObjects[ajaxIndex].response!='OK'){
792 alert('ERROR WHEN TRYING TO RENAME NODE: ' + this.ajaxObjects[ajaxIndex].response); // Rename failed
796 __saveTextBoxChanges : function(e,inputObj)
798 if(!inputObj && this)inputObj = this;
799 if(document.all)e = event;
800 if(e.keyCode && e.keyCode==27){
801 JSTreeObj.__cancelRename(e,inputObj);
804 inputObj.style.display='none';
805 inputObj.nextSibling.style.visibility='visible';
806 if(inputObj.value.length>0){
807 inputObj.nextSibling.innerHTML = inputObj.value;
808 // Send changes to the server.
809 if (JSTreeObj.renameState != JSTreeObj.RENAME_STATE_BEGIN) {
812 JSTreeObj.renameState = JSTreeObj.RENAME_STATE_REQUEST_SENDED;
813 var ajaxIndex = JSTreeObj.ajaxObjects.length;
814 JSTreeObj.ajaxObjects[ajaxIndex] = new sack();
815 JSTreeObj.ajaxObjects[ajaxIndex].method = "GET";
816 JSTreeObj.ajaxObjects[ajaxIndex].setVar("renameId", inputObj.parentNode.id.replace(/[^0-9]/gi,''));
817 JSTreeObj.ajaxObjects[ajaxIndex].setVar("newName", inputObj.value);
818 JSTreeObj.__addAdditionalRequestParameters(JSTreeObj.ajaxObjects[ajaxIndex], JSTreeObj.additionalRenameRequestParameters);
819 JSTreeObj.ajaxObjects[ajaxIndex].requestFile = JSTreeObj.filePathRenameItem; // Specifying which file to get
820 JSTreeObj.ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj.__renameComplete(ajaxIndex); } ; // Specify function that will be executed after file has been found
821 JSTreeObj.ajaxObjects[ajaxIndex].runAJAX(); // Execute AJAX function
823 document.all.renameId.value=inputObj.parentNode.id.replace(/[^0-9]/gi,'');
824 document.all.newName.value= inputObj.value;
825 renameMyTree_byForm();
830 __cancelRename : function(e,inputObj)
832 JSTreeObj.renameState = JSTreeObj.RENAME_STATE_CANCELD;
833 if(!inputObj && this)inputObj = this;
834 inputObj.value = JSTreeObj.helpObj.innerHTML;
835 inputObj.nextSibling.innerHTML = JSTreeObj.helpObj.innerHTML;
836 inputObj.style.display = 'none';
837 inputObj.nextSibling.style.visibility = 'visible';
840 __renameCheckKeyCode : function(e)
842 if(document.all)e = event;
843 if(e.keyCode==13){ // Enter pressed
844 JSTreeObj.__saveTextBoxChanges(false,this);
846 if(e.keyCode==27){ // ESC pressed
847 JSTreeObj.__cancelRename(false,this);
851 __createTextBox : function(obj)
853 var textBox = document.createElement('INPUT');
854 textBox.className = 'folderTreeTextBox';
855 textBox.value = obj.innerHTML;
856 obj.parentNode.insertBefore(textBox,obj);
857 textBox.id = 'textBox' + obj.parentNode.id.replace(/[^0-9]/gi,'');
858 textBox.onblur = this.__saveTextBoxChanges;
859 textBox.onkeydown = this.__renameCheckKeyCode;
860 textBox.style.height="16px";
861 this.__renameEnableTextBox(obj);
864 __renameEnableTextBox : function(obj)
866 JSTreeObj.renameState = JSTreeObj.RENAME_STATE_BEGIN;
867 obj.style.visibility = 'hidden';
868 obj.previousSibling.value = obj.innerHTML;
869 obj.previousSibling.style.display = 'inline';
870 obj.previousSibling.select();
873 renameItem : function(obj1,obj2)
875 currentItemToEdit = obj2.parentNode; // Reference to the <li> tag.
876 if(!obj2.previousSibling || obj2.previousSibling.tagName.toLowerCase()!='input'){
877 this.__createTextBox(obj2);
879 this.__renameEnableTextBox(obj2);
881 this.helpObj.innerHTML = obj2.innerHTML;
885 initTree : function(selectedItemId)
888 JSTreeObj.createDropIndicator();
889 document.documentElement.onselectstart = JSTreeObj.cancelSelectionEvent;
890 document.documentElement.ondragstart = JSTreeObj.cancelEvent;
891 document.documentElement.onmousedown = JSTreeObj.removeHighlight;
893 /* Creating help object for storage of values */
894 this.helpObj = document.createElement('DIV');
895 this.helpObj.style.display = 'none';
896 document.body.appendChild(this.helpObj);
897 /* Create context menu */
898 if(this.deleteAllowed || this.renameAllowed || this.addAllowed){
900 /* Creating menu model for the context menu, i.e. the datasource */
901 var menuModel = new DHTMLGoodies_menuModel();
902 if(this.deleteAllowed)menuModel.addItem(1,'Delete Folder','','',false,'JSTreeObj.deleteItem');
903 if(this.deleteAllowed)menuModel.addItem(2,'Rename Folder','','',false,'JSTreeObj.renameItem');
904 if(this.addAllowed)menuModel.addItem(3,'New Folder','','',false,'JSTreeObj.addItem');
905 menuModel.addItem(4,'Create Report','','',false,'JSTreeObj.createMenuReport');
909 var menuReportNoRights = new DHTMLGoodies_menuModel();
910 menuReportNoRights.addItem(3,'Run','','',false,'JSTreeObj.runItem');
911 menuReportNoRights.init();
913 var menuReportWithRights = new DHTMLGoodies_menuModel();
914 menuReportWithRights.addItem(1,'Run','','',false,'JSTreeObj.runMenuReport');
915 menuReportWithRights.addItem(2,'Edit','','',false,'JSTreeObj.editMenuReport');
916 menuReportWithRights.addItem(3,'Delete','','',false,'JSTreeObj.deleteMenuReport');
917 menuReportWithRights.init();
920 var menuModelRenameOnly = new DHTMLGoodies_menuModel();
921 if(this.renameAllowed)menuModelRenameOnly.addItem(3,'Rename Folder','','',false,'JSTreeObj.renameItem');
922 menuModelRenameOnly.init();
924 var menuModelDeleteOnly = new DHTMLGoodies_menuModel();
925 if(this.deleteAllowed)menuModelDeleteOnly.addItem(4,'Delete Folder','','',false,'JSTreeObj.deleteItem');
926 menuModelDeleteOnly.init();
928 var menuModelAddOnly = new DHTMLGoodies_menuModel();
929 menuModelAddOnly.addItem(1,'New Folder','','',false,'JSTreeObj.addItem');
930 menuModelAddOnly.init();
932 window.refToDragDropTree = this;
934 this.contextMenu = new DHTMLGoodies_contextMenu();
935 this.contextMenu.setWidth(120);
936 referenceToDHTMLSuiteContextMenu = this.contextMenu;
944 var dhtmlgoodies_tree = document.getElementById(this.idOfTree);
945 var menuItems = dhtmlgoodies_tree.getElementsByTagName('LI'); // Get an array of all menu items
946 for(var no=0;no<menuItems.length;no++){
947 // No children var set ?
948 var noChildren = false;
949 var tmpVar = menuItems[no].getAttribute('noChildren');
950 if(!tmpVar)tmpVar = menuItems[no].noChildren;
951 if(tmpVar=='true')noChildren=true;
954 var tmpVar = menuItems[no].getAttribute('noDrag');
955 if(!tmpVar)tmpVar = menuItems[no].noDrag;
956 if(tmpVar=='true')noDrag=true;
959 var subItems = menuItems[no].getElementsByTagName('UL');
960 var img = document.createElement('IMG');
961 img.src = this.imageFolder + this.plusImage;
962 img.onclick = JSTreeObj.showHideNode;
964 if(subItems.length==0)img.style.visibility='hidden';else{
965 subItems[0].id = 'tree_ul_' + treeUlCounter;
968 var aTag = menuItems[no].getElementsByTagName('A')[0];
969 aTag.id = 'nodeATag' + menuItems[no].id.replace(/[^0-9]/gi,'');
970 //aTag.onclick = JSTreeObj.showHideNode;
971 if(!noDrag)aTag.onmousedown = JSTreeObj.initDrag;
972 if(!noChildren)aTag.onmousemove = JSTreeObj.moveDragableNodes;
973 menuItems[no].insertBefore(img,aTag);
974 //menuItems[no].id = 'dhtmlgoodies_treeNode' + nodeId;
975 var folderImg = document.createElement('IMG');
976 if(!noDrag)folderImg.onmousedown = JSTreeObj.initDrag;
977 folderImg.onmousemove = JSTreeObj.moveDragableNodes;
978 if(menuItems[no].className){
979 folderImg.src = this.imageFolder + menuItems[no].className;
980 } else if (menuItems[no].getAttribute('imgFile')){
981 folderImg.src = this.imageFolder + menuItems[no].getAttribute('imgFile');
983 folderImg.src = this.imageFolder + this.folderImage;
985 menuItems[no].insertBefore(folderImg,aTag);
987 if(this.contextMenu){
988 var noDelete = menuItems[no].getAttribute('noDelete');
989 if(!noDelete)noDelete = menuItems[no].noDelete;
990 var noRename = menuItems[no].getAttribute('noRename');
991 if(!noRename)noRename = menuItems[no].noRename;
992 var noAdd = menuItems[no].getAttribute('noChild');
993 if(!noAdd)noAdd = menuItems[no].noChild;
996 if (menuItems[no].id.replace(/[^0-9]/gi,'').substr(0,3) != '000' ){//for folders
997 if(noRename=='true' && noDelete=='true'){
998 if (noAdd != 'true'){
999 this.contextMenu.attachToElement(aTag,false,menuModelAddOnly);
1002 if(noDelete == 'true')this.contextMenu.attachToElement(aTag,false,menuModelRenameOnly);
1003 else if(noRename == 'true')this.contextMenu.attachToElement(aTag,false,menuModelDeleteOnly);
1004 else this.contextMenu.attachToElement(aTag,false,menuModel);
1008 var noRights = menuItems[no].getAttribute('noReportRights');
1009 if(!noRights)noRights = menuItems[no].noRights;
1010 if(noRights=='true'){
1011 this.contextMenu.attachToElement(aTag,false,menuReportNoRights);
1013 this.contextMenu.attachToElement(aTag,false,menuReportWithRights);
1019 //highlighting the selected item
1020 if (selectedItemId != null && selectedItemId == menuItems[no].id.replace(/[^0-9]/gi,'')){
1021 if(JSTreeObj.currentlyActiveItem) JSTreeObj.currentlyActiveItem.className = '';
1022 aTag.className = 'highlightedNodeItem';
1023 JSTreeObj.currentlyActiveItem = aTag;
1024 JSTreeObj.selectedItem = aTag;
1025 folderImg.tabindex="1";
1027 //folderImg.focus();
1029 this.addEvent(aTag,'contextmenu',this.highlightItem);
1030 this.addEvent(aTag,'click',this.clickItem);
1038 initExpandedNodes = this.Get_Cookie('dhtmlgoodies_expandedNodes');
1039 if(initExpandedNodes){
1040 var nodes = initExpandedNodes.split(',');
1041 for(var no=0;no<nodes.length;no++){
1042 if(nodes[no])this.showHideNode(false,nodes[no]);
1049 document.documentElement.onmousemove = JSTreeObj.moveDragableNodes;
1050 document.documentElement.onmouseup = JSTreeObj.dropDragableNodes;
1053 __addAdditionalRequestParameters : function(ajax, parameters)
1055 for (var parameter in parameters) {
1056 ajax.setVar(parameter, parameters[parameter]);