<?xml version="1.0" encoding="UTF-8" ?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->
<library>

<class name="dragItemFileExplorer" extends="view">
	
	<attribute name="refObj" value="null"/>
	
	<attribute name="dragItemResource" value="" type="string"/>
	
	<attribute name="overItem" value="null"/>
	
	<attribute name="alreadySent" value="false" type="boolean" />
	
	<attribute name="fileExplorerItemId" value="0" type="number" />
	<attribute name="newParentFileExplorerItemId" value="0" type="number" />
    <attribute name="isOwner" value="false" type="boolean" />
    <attribute name="moveToHome" value="false" type="boolean" />
	
	<handler name="oninit">
		lz.Track.activate(canvas.currentImagesListdraw.currentTrackGroupName);
		canvas.currentImagesListdraw.currentDragItem = this;
		lz.Cursor.showHandCursor(false);
		lz.ModeManager.globalLockMouseEvents();
		this.dragger.apply();
	</handler>
	
	<method name="sendOverItem" args="itemRef">
		<![CDATA[
    		if (this.refObj != itemRef) {
    			
    			if (this.refObj.isFolder) {
    				if (!itemRef.isTrashCan && !itemRef.isFolder) {
    					//No Folders to the whiteboard please
    					return;
    				}
    			}
    			
        		this.overItem = itemRef;
        		this._dragIcon.setAttribute("frame",2);
    		}
		]]>
	</method>
	
	<method name="sendOutItem" args="itemRef">
        this.overItem = null;
        this._dragIcon.setAttribute("frame",1);
    </method>
	
	<handler name="onmouseup" reference="lz.GlobalMouse" args="who">
        this.close();
    </handler>
    
    <method name="close">
    <![CDATA[
    	//This can happen when the confirmation pops up
    	if (this.alreadySent) {
    		return;
    	}
    	this.alreadySent = true;
    	if ($debug) Debug.write("close Drag Item");
    	lz.Cursor.showHandCursor(true);
    	lz.Track.deactivate(canvas.currentImagesListdraw.currentTrackGroupName);
    	lz.ModeManager.globalUnlockMouseEvents();
    	canvas.currentImagesListdraw.currentDragItem = null;
    	this.dragger.remove();
    	
    	if (this.overItem != null) {
    		
    		if ($debug) Debug.write("this.overItem ",this.overItem);
    		
    		if (this.overItem["isTrashCan"] && this.overItem.isTrashCan) {
    			if ($debug) Debug.write("SEND TO GARBAGE");
    			this.fileExplorerItemId = this.refObj.fileExplorerItemId;
    			new lz.confirmationSingle(canvas,{
            			   refObj:this,
            			   labelid:710,
            			   labeliderror:713,
            			   showCheckBox:false,
                           refReturnMethod:"sendConfirmation"
            			});
    		} else if (this.overItem["isFolder"] && this.overItem.isFolder){
    			if ($debug) Debug.write("MOVE ITEM",this.refObj.fileExplorerItemId);
    			if ($debug) Debug.write("MOVE TO PARENT",this.overItem.fileExplorerItemId);
    			this.fileExplorerItemId = this.refObj.fileExplorerItemId;
    			this.newParentFileExplorerItemId = this.overItem.fileExplorerItemId;
    			if (this.overItem.fileExplorerItemId == 0) {
    			    this.isOwner = this.overItem.isOwner;
    			}
    			
    			//check if this is a home folder or not
    			var checkForOwer = this.overItem.checkForIsOwner();
    			if ($debug) Debug.write("checkForOwer ::",checkForOwer);
    			this.moveToHome = checkForOwer;
    			
    			//check that the file is not moved inside itself
    			if (this.overItem.checkForIsChild(this.refObj.fileExplorerItemId)) {
    				new lz.labelerrorPopup(canvas,{errorlabelid:922});
    				this.destroy();
    				return;
    			}
    			
    			this.moveFile();
    		} else {
    			if ($debug) Debug.warn("Drag to whiteboard !!! ");
    			if (this.refObj.isVideo) {
    				this.refObj.playVideo();
    			} else if (this.refObj.isPresentation) {
    			    this.refObj.loadDocumentToWhiteboard();
    			} else if (this.refObj.isImage) {
    				this.refObj.loadImageToWhiteboard();
    			} else if (this.refObj.isWmlFile) {
    				this.refObj.loadWmlFile();
    			} else {
    				if ($debug) Debug.warn("Should never happen dragItemFileExplorer unhandled case");
    			}
    			this.destroy();
    		}
    	} else {
    		this.destroy();
    	}
    ]]>	
    </method>
    
    <method name="sendConfirmation" args="bool,askAgain">
    	if (bool) {
    		this.deleteFileOrFolder();
    	} else {
    		this.destroy();
    	}
    </method>
    
    <method name="deleteFileOrFolder">
        <![CDATA[
            if ($debug) Debug.write("deleteFileOrFolder HTTP 2: ");
            //this.getFileExplorerByRoom.doCall();
            var downloadurl = canvas.getUrl()+'services/FileService/deleteFileOrFolderSelf?'
                            +'SID='+canvas.sessionId
                            +'&fileExplorerItemId='+this.fileExplorerItemId;
            
            this.deleteFileOrFolderSelf.setAttribute("src",downloadurl);
            if ($debug) Debug.write("deleteFileOrFolderSelf doRequest ",downloadurl);
            this.deleteFileOrFolderSelf.doRequest();
        ]]>
    </method>
    
    <dataset name="deleteFileOrFolderSelf" type="http" >
        <handler name="ondata" args="d">
            <![CDATA[
                //if ($debug) Debug.write("ondata ",d);
                if ($debug) Debug.write("deleteFileOrFolder: ",d);
                parent.refObj.parent.parent.doOpen();
                parent.destroy();
            ]]>
        </handler>
    </dataset>
    
    <!--
    <netRemoteCallHib name="deleteFileOrFolder" funcname="fileservice.deleteFileOrFolder" 
        remotecontext="$once{ canvas.thishib }" > 
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.fileExplorerItemId;</method></netparam>
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("deleteFileOrFolder: ",value);
            parent.refObj.parent.parent.doOpen();
            parent.destroy();
        </handler>
    </netRemoteCallHib> 
     -->
    
    <!--
    public Long moveFileSelf(String SID, Long fileExplorerItemId,
            Long newParentFileExplorerItemId, Long room_id, Boolean isOwner,
            Boolean moveToHome)
     -->
     
    <method name="moveFile">
        <![CDATA[
            if ($debug) Debug.write("moveFile HTTP 1: ");
            //this.getFileExplorerByRoom.doCall();
            var downloadurl = canvas.getUrl()+'services/FileService/moveFileSelfInternal?'
                            +'SID='+canvas.sessionId
                            +'&fileExplorerItemId='+this.fileExplorerItemId
                            +'&newParentFileExplorerItemId='+this.newParentFileExplorerItemId
                            +'&roomId='+hib.currentroomid
                            +'&isOwner='+this.isOwner
                            +'&moveToHome='+this.moveToHome;
            
            this.moveFileSelf.setAttribute("src",downloadurl);
            if ($debug) Debug.write("moveFileSelf doRequest ",downloadurl);
            this.moveFileSelf.doRequest();
        ]]>
    </method>
    
    <dataset name="moveFileSelf" type="http" >
        <handler name="ondata" args="d">
            <![CDATA[
                //if ($debug) Debug.write("ondata ",d);
                if ($debug) Debug.write("moveFileSelf: ",d);
                parent.overItem.doOpen();
                parent.refObj.parent.parent.doOpen();
                parent.destroy();
            ]]>
        </handler>
    </dataset>
    
    <!--
    <netRemoteCallHib name="moveFile" funcname="fileservice.moveFile" 
        remotecontext="$once{ canvas.thishib }" > 
        
        <attribute name="fileExplorerItemId" value="0" type="number" />
        
        
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.fileExplorerItemId;</method></netparam>
        <netparam><method name="getValue">return parent.newParentFileExplorerItemId;</method></netparam>  
        <netparam><method name="getValue">return hib.currentroomid;</method></netparam>         
        <netparam><method name="getValue">return parent.isOwner;</method></netparam>
        <netparam><method name="getValue">return parent.moveToHome;</method></netparam>
          
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("moveFile: ",value);
            parent.overItem.doOpen();
            parent.refObj.parent.parent.doOpen();
            parent.destroy();
        </handler>
    </netRemoteCallHib>   
     -->  
   
	<view name="_dragFileSymbol" x="10" y="10"
		resource="$once{ parent.dragItemResource }" />
	
	<view name="_dragIcon" x="18" y="14" 
		  resource="drag_n_drop_rsc" frame="1" />
	
	<dragstate name="dragger"/>
</class>

</library>
