[VID-3] Setting docker image tag
[vid.git] / vid / src / main / webapp / static / fusion / raptor / js / tree / drag-drop-folder-tree.js
1  /************************************************************************************************************
2 Drag and drop folder tree
3 Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland
4
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.
9
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.
14
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
18
19 Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
20 written by Alf Magne Kalleland.
21
22 Alf Magne Kalleland, 2006
23 Owner of DHTMLgoodies.com
24
25
26 ************************************************************************************************************/   
27                 
28         var JSTreeObj;
29         var treeUlCounter = 0;
30         var nodeId = 1;
31                 
32         /* Constructor */
33         function JSDragDropTree()
34         {
35                 var idOfTree;
36                 var imageFolder;
37                 var folderImage;
38                 var plusImage;
39                 var minusImage;
40                 var maximumDepth;
41                 var dragNode_source;
42                 var dragNode_parent;
43                 var dragNode_sourceNextSib;
44                 var dragNode_noSiblings;
45                 var ajaxObjects;
46                 
47                 var dragNode_destination;
48                 var floatingContainer;
49                 var dragDropTimer;
50                 var dropTargetIndicator;
51                 var insertAsSub;
52                 var indicator_offsetX;
53                 var indicator_offsetX_sub;
54                 var indicator_offsetY;
55                 
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 = {};
67
68                 var renameAllowed;
69                 var deleteAllowed;
70                 var addAllowed;
71                 var currentlyActiveItem;
72                 var contextMenu;
73                 var currentItemToEdit;          // Reference to item currently being edited(example: renamed)
74                 var selectedItem;               // ADDED BY FARHAN
75                 var helpObj;
76                 
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;
87                 
88                 if(document.all){
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;
92                 }else{
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;                     
96                 }
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;                            
101                 }
102
103                 this.messageMaximumDepthReached = ''; // Use '' if you don't want to display a message 
104                 this.messageNoRightsOnFolder = 'You do not have access to this folder';
105                 
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;
114                 
115                 this.RENAME_STATE_BEGIN = 1;
116                 this.RENAME_STATE_CANCELED = 2;
117                 this.RENAME_STATE_REQUEST_SENDED = 3;
118                 this.renameState = null;
119         }
120         
121         
122         /* JSDragDropTree class */
123         JSDragDropTree.prototype = {
124                 // {{{ addEvent()
125             /**
126              *
127              *  This function adds an event listener to an element on the page.
128              *
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. 
132              * 
133              * @public
134              */ 
135                 addEvent : function(whichObject,eventType,functionName)
136                 { 
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] ); 
141                   } else 
142                     whichObject.addEventListener(eventType,functionName,false);             
143                 } 
144                 // }}}  
145                 ,       
146                 // {{{ removeEvent()
147             /**
148              *
149              *  This function removes an event listener from an element on the page.
150              *
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. 
154              * 
155              * @public
156              */         
157                 removeEvent : function(whichObject,eventType,functionName)
158                 { 
159                   if(whichObject.detachEvent){ 
160                     whichObject.detachEvent('on'+eventType, whichObject[eventType+functionName]); 
161                     whichObject[eventType+functionName] = null; 
162                   } else 
163                     whichObject.removeEventListener(eventType,functionName,false); 
164                 } 
165                 ,       
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)); 
174                 } 
175                 ,
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; 
187                 } 
188                 ,
189                 setFileNameRename : function(newFileName)
190                 {
191                         this.filePathRenameItem = newFileName;
192                 }
193                 ,
194                 setFileNameDelete : function(newFileName)
195                 {
196                         this.filePathDeleteItem = newFileName;
197                 }
198                 ,
199                 setAdditionalRenameRequestParameters : function(requestParameters)
200                 {
201                         this.additionalRenameRequestParameters = requestParameters;
202                 }
203                 ,
204                 setAdditionalDeleteRequestParameters : function(requestParameters)
205                 {
206                         this.additionalDeleteRequestParameters = requestParameters;
207                 }
208                 ,setRenameAllowed : function(renameAllowed)
209                 {
210                         this.renameAllowed = renameAllowed;                     
211                 }
212                 ,
213                 setDeleteAllowed : function(deleteAllowed)
214                 {
215                         this.deleteAllowed = deleteAllowed;     
216                 }
217                 ,
218                 setAddAllowed : function(addAllowed)
219                 {
220                         this.addAllowed = addAllowed;   
221                 }
222                 ,setMaximumDepth : function(maxDepth)
223                 {
224                         this.maximumDepth = maxDepth;   
225                 }
226                 ,setMessageMaximumDepthReached : function(newMessage)
227                 {
228                         this.messageMaximumDepthReached = newMessage;
229                 }
230                 ,       
231                 setImageFolder : function(path)
232                 {
233                         this.imageFolder = path;        
234                 }
235                 ,
236                 setFolderImage : function(imagePath)
237                 {
238                         this.folderImage = imagePath;                   
239                 }
240                 ,
241                 setPlusImage : function(imagePath)
242                 {
243                         this.plusImage = imagePath;                             
244                 }
245                 ,
246                 setMinusImage : function(imagePath)
247                 {
248                         this.minusImage = imagePath;                    
249                 }
250                 ,               
251                 setTreeId : function(idOfTree)
252                 {
253                         this.idOfTree = idOfTree;                       
254                 }       
255                 ,
256                 expandAll : function()
257                 {
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);
263                                 }                       
264                         }
265                 }       
266                 ,
267                 collapseAll : function()
268                 {
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);
274                                 }                       
275                         }       
276                         JSTreeObj.showHideNode(false,menuItems[0].id);                          
277                 }       
278                 ,
279                 /*
280                 Find top pos of a tree node
281                 */
282                 getTopPos : function(obj){
283                         var top = obj.offsetTop/1;
284                         while((obj = obj.offsetParent) != null){
285                                 if(obj.tagName!='HTML')top += obj.offsetTop;
286                         }                       
287                         if(document.all)top = top/1 + 13; else top = top/1 + 4;         
288                         return top;
289                 }
290                 ,       
291                 /*
292                 Find left pos of a tree node
293                 */
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;
298                         }
299                                 
300                         if(document.all)left = left/1 - 2;
301                         return left;
302                 }       
303                         
304                 ,
305                 showHideNode : function(e,inputId)
306                 {
307                         if(inputId){
308                                 if(!document.getElementById(inputId))return;
309                                 thisNode = document.getElementById(inputId).getElementsByTagName('IMG')[0]; 
310                         }else {
311                                 thisNode = this;
312                                 if(this.tagName=='A')thisNode = this.parentNode.getElementsByTagName('IMG')[0]; 
313                                 
314                         }
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 + ',';
324                         }else{
325                                 thisNode.src = thisNode.src.replace(JSTreeObj.minusImage,JSTreeObj.plusImage);
326                                 parentNode.getElementsByTagName('UL')[0].style.display='none';
327                                 initExpandedNodes = initExpandedNodes.replace(',' + inputId,'');
328                         }       
329                         JSTreeObj.Set_Cookie('dhtmlgoodies_expandedNodes',initExpandedNodes,500);                       
330                         return false;                                           
331                 }
332                 ,
333                 /*expand only the selected node*/
334                 showSelectedNode : function(selectedItemId)
335                 {
336                         var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');      // Get an array of all menu items
337                         
338                         var selectedNode ;
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];
342                                         break;
343                                 }
344                         }
345                         do{
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);
350                                         }
351                                         selectedNode = selectedNode.parentNode;
352                                 }
353                         }while (selectedNode && selectedNode.id.replace(/[^0-9]/gi,'') != '0');
354                         return false;                                           
355                 }
356                 ,
357                 isDeleteAllowed : function(selectedItemId)
358                 {
359                         var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');      // Get an array of all menu items
360                         
361                         var selectedNode ;
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];
365                                         break;
366                                 }
367                         }
368                         if (selectedNode && selectedNode.getAttribute('noDelete') && selectedNode.getAttribute('noDelete') == 'true')
369                                 return false;
370                         else
371                                 return true;
372                         
373                 }
374                 ,
375                 isAddAllowed : function(selectedItemId)
376                 {
377                         var menuItems = document.getElementById(this.idOfTree).getElementsByTagName('LI');      // Get an array of all menu items
378                         
379                         var selectedNode ;
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];
383                                         break;
384                                 }
385                         }
386                         if (selectedNode && selectedNode.getAttribute('noChild') && selectedNode.getAttribute('noChild') == 'true')
387                                 return false;
388                         else
389                                 return true;
390                         
391                 }
392                 ,
393                 /* Initialize drag */
394                 initDrag : function(e)
395                 {
396                         if(document.all)e = event;      
397                         
398                         var subs = JSTreeObj.floatingContainer.getElementsByTagName('LI');
399                         if(subs.length>0){
400                                 if(JSTreeObj.dragNode_sourceNextSib){
401                                         JSTreeObj.dragNode_parent.insertBefore(JSTreeObj.dragNode_source,JSTreeObj.dragNode_sourceNextSib);
402                                 }else{
403                                         JSTreeObj.dragNode_parent.appendChild(JSTreeObj.dragNode_source);
404                                 }                                       
405                         }
406                         
407                         JSTreeObj.dragNode_source = this.parentNode;
408                         JSTreeObj.dragNode_parent = this.parentNode.parentNode;
409                         JSTreeObj.dragNode_sourceNextSib = false;
410
411                         
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();
416                         return false;
417                 }
418                 ,
419                 timerDrag : function()
420                 {       
421                         if(this.dragDropTimer>=0 && this.dragDropTimer<10){
422                                 this.dragDropTimer = this.dragDropTimer + 1;
423                                 setTimeout('JSTreeObj.timerDrag()',20);
424                                 return;
425                         }
426                         if(this.dragDropTimer==10)
427                         {
428                                 JSTreeObj.floatingContainer.style.display='block';
429                                 JSTreeObj.floatingContainer.appendChild(JSTreeObj.dragNode_source);     
430                         }
431                 }
432                 ,
433                 moveDragableNodes : function(e)
434                 {
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;      
439                                         
440                         JSTreeObj.floatingContainer.style.left = dragDrop_x + 'px';
441                         JSTreeObj.floatingContainer.style.top = dragDrop_y + 'px';
442                         
443                         var thisObj = this;
444                         if(thisObj.tagName=='A' || thisObj.tagName=='IMG')thisObj = thisObj.parentNode;
445
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;
450                                         
451                         if(thisObj && thisObj.id)
452                         {
453                                 JSTreeObj.dragNode_destination = thisObj;
454                                 var img = thisObj.getElementsByTagName('IMG')[1];
455                                 var tmpObj= JSTreeObj.dropTargetIndicator;
456                                 tmpObj.style.display='block';
457                                 
458                                 var eventSourceObj = this;
459                                 if(JSTreeObj.dragNode_noSiblings && eventSourceObj.tagName=='IMG')eventSourceObj = eventSourceObj.nextSibling;
460                                 
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';
466                                 }else{
467                                         tmpImg.src = tmpImg.src.replace('ind2','ind1');
468                                         JSTreeObj.insertAsSub = false;
469                                         tmpObj.style.left = (JSTreeObj.getLeftPos(eventSourceObj) + JSTreeObj.indicator_offsetX) + 'px';
470                                 }
471                                 
472                                 tmpObj.style.top = (JSTreeObj.getTopPos(thisObj) + JSTreeObj.indicator_offsetY) - document.getElementById("scrollableTable").scrollTop + 'px'  ;
473                                 
474                                 
475                         }
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;
482                         
483                         return false;
484                         
485                 }
486                 ,
487                 dropDragableNodes:function()
488                 {
489                         if(JSTreeObj.dragDropTimer<10){                         
490                                 JSTreeObj.dragDropTimer = -1;
491                                 return;
492                         }
493                         var showMessage = false;
494                         var message = '';
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);                
499                                 
500                                 if(countLevels>JSTreeObj.maximumDepth){
501                                         JSTreeObj.dragNode_destination = false;
502                                         showMessage = true;     // Used later down in this function
503                                         message = JSTreeObj.messageMaximumDepthReachedl
504                                 }
505                         }
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;
510                         }
511                         
512                         
513                         if(JSTreeObj.dragNode_destination){                     
514                                                 
515                                 if(JSTreeObj.insertAsSub){
516                                         var uls = JSTreeObj.dragNode_destination.getElementsByTagName('UL');
517                                         if(uls.length>0){
518                                                 ul = uls[0];
519                                                 ul.style.display='block';
520                                                 
521                                                 var lis = ul.getElementsByTagName('LI');
522
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);      
527                                                 }
528                                         }else{
529                                                 var ul = document.createElement('UL');
530                                                 ul.style.display='block';
531                                                 JSTreeObj.dragNode_destination.appendChild(ul);
532                                                 ul.appendChild(JSTreeObj.dragNode_source);
533                                         }
534                                         var img = JSTreeObj.dragNode_destination.getElementsByTagName('IMG')[0];                                        
535                                         img.style.visibility='visible';
536                                         img.src = img.src.replace(JSTreeObj.plusImage,JSTreeObj.minusImage);                                    
537                                         
538                                         
539                                 }else{
540                                         if(JSTreeObj.dragNode_destination.nextSibling){
541                                                 var nextSib = JSTreeObj.dragNode_destination.nextSibling;
542                                                 nextSib.parentNode.insertBefore(JSTreeObj.dragNode_source,nextSib);
543                                         }else{
544                                                 JSTreeObj.dragNode_destination.parentNode.appendChild(JSTreeObj.dragNode_source);
545                                         }
546                                 }       
547                                 /* Clear parent object */
548                                 var tmpObj = JSTreeObj.dragNode_parent;
549                                 var lis = tmpObj.getElementsByTagName('LI');
550                                 if(lis.length==0){
551                                         var img = tmpObj.parentNode.getElementsByTagName('IMG')[0];
552                                         img.style.visibility='hidden';  // Hide [+],[-] icon
553                                         tmpObj.parentNode.removeChild(tmpObj);                                          
554                                 }
555                                 
556                         }else{
557                                 // Putting the item back to it's original location
558                                 
559                                 if(JSTreeObj.dragNode_sourceNextSib){
560                                         JSTreeObj.dragNode_parent.insertBefore(JSTreeObj.dragNode_source,JSTreeObj.dragNode_sourceNextSib);
561                                 }else{
562                                         JSTreeObj.dragNode_parent.appendChild(JSTreeObj.dragNode_source);
563                                 }                       
564                                         
565                         }
566                         JSTreeObj.dropTargetIndicator.style.display='none';             
567                         JSTreeObj.dragDropTimer = -1;   
568                         if(showMessage && message){ alert(message); return;}
569                         //save tree structure
570                         saveMyTree_byForm();
571                 }
572                 ,
573                 createDropIndicator : function()
574                 {
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);
583                         
584                 }
585                 ,
586                 dragDropCountLevels : function(obj,direction,stopAtObject){
587                         var countLevels = 0;
588                         if(direction=='up'){
589                                 while(obj.parentNode && obj.parentNode!=stopAtObject){
590                                         obj = obj.parentNode;
591                                         if(obj.tagName=='UL')countLevels = countLevels/1 +1;
592                                 }               
593                                 return countLevels;
594                         }       
595                         
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));
600                                 }
601                                 return countLevels;
602                         
603                         }       
604                 }               
605                 ,
606                 cancelEvent : function()
607                 {
608                         return false;   
609                 }
610                 ,
611                 cancelSelectionEvent : function()
612                 {
613                         
614                         if(JSTreeObj.dragDropTimer<10)return true;
615                         return false;   
616                 }
617                 ,getNodeOrders : function(initObj,saveString)
618                 {
619                         
620                         if(!saveString)var saveString = '';
621                         if(!initObj){
622                                 initObj = document.getElementById(this.idOfTree);
623
624                         }
625                         var lis = initObj.getElementsByTagName('LI');
626
627                         if(lis.length>0){
628                                 var li = lis[0];
629                                 while(li){
630                                         if(li.id){
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,'');
635                                                 if(numericID!='0'){
636                                                         saveString = saveString + numericID;
637                                                         saveString = saveString + '-';
638                                                         
639                                                         
640                                                         if(li.parentNode.id!=this.idOfTree)saveString = saveString + numericParentID; else saveString = saveString + '0';
641                                                 }
642                                                 var ul = li.getElementsByTagName('UL');
643                                                 if(ul.length>0){
644                                                         saveString = this.getNodeOrders(ul[0],saveString);      
645                                                 }       
646                                         }                       
647                                         li = li.nextSibling;
648                                 }
649                         }
650
651                         if(initObj.id == this.idOfTree){
652                                 return saveString;
653                                                         
654                         }
655                         return saveString;
656                 }
657                 ,highlightItem : function(inputObj,e)
658                 {
659                         if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
660                         this.className = 'highlightedNodeItem';
661                         JSTreeObj.currentlyActiveItem = this;                   
662                 }
663                 ,clickItem : function(inputObj,e)
664                 {
665                         if(JSTreeObj.currentlyActiveItem) JSTreeObj.currentlyActiveItem.className = '';
666                         this.className = 'highlightedNodeItem';
667                         JSTreeObj.currentlyActiveItem = this;
668                         JSTreeObj.selectedItem = this;                  
669                 },
670                 removeHighlight : function()
671                 {
672                         //if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
673                         //JSTreeObj.currentlyActiveItem = false;
674                 }
675                 ,
676                 hasSubNodes : function(obj)
677                 {
678                         var subs = obj.getElementsByTagName('LI');
679                         if(subs.length>0)return true;
680                         return false;   
681                 }
682                 ,
683                 deleteItem : function(obj1,obj2)
684                 {
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    
689                                 //deleteItem();
690                         }else{
691                                 return false;
692                         }
693                         
694                         
695                 }
696                 ,
697                 addItem : function(obj1,obj2)
698                 {
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       
701                 }
702                 ,
703                 createMenuReport : function(obj1,obj2)
704                 {
705                         JSTreeObj.selectedItem = obj2;
706                         createReport();
707                 }
708                 ,               
709                 runMenuReport : function(obj1,obj2)
710                 {
711                         JSTreeObj.selectedItem = obj2;
712                         runReport();
713                         
714                 }
715                 ,
716                 editMenuReport : function(obj1,obj2)
717                 {
718                         JSTreeObj.selectedItem = obj2;
719                         editReport();
720                 }
721                 ,
722                 deleteMenuReport : function(obj1,obj2)
723                 {
724                         JSTreeObj.selectedItem = obj2;
725                         if (confirm("Do you want to delete this report?")){
726                                 deleteReport();
727                         }
728                         
729                 }
730                 ,
731                 __refreshDisplay : function(obj)
732                 {
733                         if(this.hasSubNodes(obj))return;
734
735                         var img = obj.getElementsByTagName('IMG')[0];
736                         img.style.visibility = 'hidden';        
737                 }
738                 ,
739                 __deleteItem_step2 : function(obj)
740                 {
741
742                         var saveString = obj.id.replace(/[^0-9]/gi,'');
743                         
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,'');
747                         }
748                         
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();
760                         
761                         
762                 }
763                 ,
764                 __addItem_step2 : function(obj)
765                 {
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;
771                         
772                         addMyTree_byForm();
773                         
774                 }
775                 ,
776                 __deleteComplete : function(ajaxIndex,obj)
777                 {
778                         if(this.ajaxObjects[ajaxIndex].response!='OK'){
779                                 alert('ERROR WHEN TRYING TO DELETE NODE: ' + this.ajaxObjects[ajaxIndex].response);     // Rename failed
780                         }else{
781                                 var parentRef = obj.parentNode.parentNode;
782                                 obj.parentNode.removeChild(obj);
783                                 this.__refreshDisplay(parentRef);
784                                 
785                         }                       
786                         
787                 }
788                 ,
789                 __renameComplete : function(ajaxIndex)
790                 {
791                         if(this.ajaxObjects[ajaxIndex].response!='OK'){
792                                 alert('ERROR WHEN TRYING TO RENAME NODE: ' + this.ajaxObjects[ajaxIndex].response);     // Rename failed
793                         }
794                 }
795                 ,
796                 __saveTextBoxChanges : function(e,inputObj)
797                 {
798                         if(!inputObj && this)inputObj = this;
799                         if(document.all)e = event;
800                         if(e.keyCode && e.keyCode==27){
801                                 JSTreeObj.__cancelRename(e,inputObj);
802                                 return;
803                         }
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) {
810                                         return;
811                                 }
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                
822                                 
823                                 document.all.renameId.value=inputObj.parentNode.id.replace(/[^0-9]/gi,'');
824                                 document.all.newName.value= inputObj.value;
825                                 renameMyTree_byForm();
826                                 
827                         }
828                 }
829                 ,
830                 __cancelRename : function(e,inputObj)
831                 {
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';
838                 }
839                 ,
840                 __renameCheckKeyCode : function(e)
841                 {
842                         if(document.all)e = event;
843                         if(e.keyCode==13){      // Enter pressed
844                                 JSTreeObj.__saveTextBoxChanges(false,this);     
845                         }       
846                         if(e.keyCode==27){      // ESC pressed
847                                 JSTreeObj.__cancelRename(false,this);
848                         }
849                 }
850                 ,
851                 __createTextBox : function(obj)
852                 {
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);
862                 }
863                 ,
864                 __renameEnableTextBox : function(obj)
865                 {
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();
871                 }
872                 ,
873                 renameItem : function(obj1,obj2)
874                 {
875                         currentItemToEdit = obj2.parentNode;    // Reference to the <li> tag.
876                         if(!obj2.previousSibling || obj2.previousSibling.tagName.toLowerCase()!='input'){
877                                 this.__createTextBox(obj2);
878                         }else{
879                                 this.__renameEnableTextBox(obj2);
880                         }
881                         this.helpObj.innerHTML = obj2.innerHTML;
882
883                 }
884                 ,
885                 initTree : function(selectedItemId)
886                 {
887                         JSTreeObj = this;
888                         JSTreeObj.createDropIndicator();
889                         document.documentElement.onselectstart = JSTreeObj.cancelSelectionEvent;
890                         document.documentElement.ondragstart = JSTreeObj.cancelEvent;
891                         document.documentElement.onmousedown = JSTreeObj.removeHighlight;
892                         
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){
899                                 try{
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');
906                                         menuModel.init();       
907                                         
908                                         /*For Reports*/
909                                         var menuReportNoRights = new DHTMLGoodies_menuModel();
910                                         menuReportNoRights.addItem(3,'Run','','',false,'JSTreeObj.runItem');
911                                         menuReportNoRights.init();      
912                                         
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();    
918                                         
919                                         
920                                         var menuModelRenameOnly = new DHTMLGoodies_menuModel();
921                                         if(this.renameAllowed)menuModelRenameOnly.addItem(3,'Rename Folder','','',false,'JSTreeObj.renameItem');
922                                         menuModelRenameOnly.init();     
923                                         
924                                         var menuModelDeleteOnly = new DHTMLGoodies_menuModel();
925                                         if(this.deleteAllowed)menuModelDeleteOnly.addItem(4,'Delete Folder','','',false,'JSTreeObj.deleteItem');
926                                         menuModelDeleteOnly.init();     
927                                         
928                                         var menuModelAddOnly = new DHTMLGoodies_menuModel();
929                                         menuModelAddOnly.addItem(1,'New Folder','','',false,'JSTreeObj.addItem');
930                                         menuModelAddOnly.init();        
931                                         
932                                         window.refToDragDropTree = this;
933                                         
934                                         this.contextMenu = new DHTMLGoodies_contextMenu();
935                                         this.contextMenu.setWidth(120);
936                                         referenceToDHTMLSuiteContextMenu = this.contextMenu;
937                                 }catch(e){
938                                         
939                                 }
940                         }
941
942                                         
943                         var nodeId = 0;
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;
952                                 // No drag var set ?
953                                 var noDrag = false;
954                                 var tmpVar = menuItems[no].getAttribute('noDrag');
955                                 if(!tmpVar)tmpVar = menuItems[no].noDrag;
956                                 if(tmpVar=='true')noDrag=true;
957                                                  
958                                 nodeId++;
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;
963                                 
964                                 if(subItems.length==0)img.style.visibility='hidden';else{
965                                         subItems[0].id = 'tree_ul_' + treeUlCounter;
966                                         treeUlCounter++;
967                                 }
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');
982                                 } else{
983                                         folderImg.src = this.imageFolder + this.folderImage;
984                                 }
985                                 menuItems[no].insertBefore(folderImg,aTag);
986                                 
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;
994                                         
995                                         
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);
1000                                                         }
1001                                                 }else{
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);
1005                                         
1006                                                 }
1007                                         }else{//for reports
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);
1012                                                 }else{
1013                                                         this.contextMenu.attachToElement(aTag,false,menuReportWithRights);
1014                                                 }
1015                                                         
1016                                         
1017                                         }
1018                                 }
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";
1026                                         //alert(1);
1027                                         //folderImg.focus();
1028                                 }
1029                                 this.addEvent(aTag,'contextmenu',this.highlightItem);
1030                                 this.addEvent(aTag,'click',this.clickItem);
1031                                 
1032                 
1033                                 
1034                         }       
1035                         
1036
1037                         
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]);        
1043                                 }                       
1044                         }                       
1045                         
1046                         
1047                         
1048                         
1049                         document.documentElement.onmousemove = JSTreeObj.moveDragableNodes;     
1050                         document.documentElement.onmouseup = JSTreeObj.dropDragableNodes;
1051                 }
1052                 ,
1053                 __addAdditionalRequestParameters : function(ajax, parameters)
1054                 {
1055                         for (var parameter in parameters) {
1056                                 ajax.setVar(parameter, parameters[parameter]);
1057                         }
1058                 }
1059         }