<?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="baseFLVExplorerItem" extends="view">
	
	<attribute name="refObjListRoot" value="null"/>
	
	<attribute name="isRoot" value="false" type="boolean" />
	
	<attribute name="fileIcon" type="string" value="string" />
	
	<attribute name="open" value="false" type="boolean" />
	
	<attribute name="fileExplorerItemId" value="0" type="number" />
	<attribute name="isOwner" value="false" type="boolean" />
	
	<attribute name="isFolder" value="true" type="boolean" />
	<attribute name="isImage" value="false" type="boolean" />
	<attribute name="isPresentation" value="false" type="boolean" />
	
	<attribute name="fileName" value="" type="string" />
	<attribute name="fileHash" value="" type="string" />
	
	<attribute name="selected" value="false" type="boolean"/>
	
	<attribute name="singleClickDelegate" value="null" />
	<attribute name="singleClickStarted" value="false" type="boolean" />
	
	<attribute name="isMouseDownDragAction" value="false" type="boolean"/>
	
	<!-- If this is true, then this item has been drag-n-droped and it makes no 
	       sense to handle any single or double click event -->
	<attribute name="mouseDownClickUsed" value="false" type="boolean" />
	<attribute name="mouseDownClickDelegate" value="null" />
	
	<attribute name="isTrashCan" value="false" type="boolean" />
	
	<handler name="oninit">
		this.singleClickDelegate = new LzDelegate( this, "doSingleClick" );
		this.resetClickDelegate = new LzDelegate( this, "doResetSingleClick" );
		this.mouseDownClickDelegate = new LzDelegate( this, "doMouseDownClick" );
		if (this.isFolder) {
		    lz.Track.register(this._fileName, canvas.currentImagesListdraw.currentTrackGroupName);
		}
	</handler>
	
	<method name="doOpen">
		this.open = true;
		if (this.isFolder) {
    		this.icon_folder_pre.setAttribute("frame",2);
    		this.content.setAttribute("visibility","visible");
			this._folderIcon.setAttribute("frame",2);
		    this.getFLVExplorerByParent.doCall();
		}
	</method>
	
	<method name="doClose">
		this.open = false;
		if (this.isFolder) {
            this.icon_folder_pre.setAttribute("frame",1);
            this.content.setAttribute("visibility","hidden");
            this._folderIcon.setAttribute("frame",1);
		}
	</method>
	
    <method name="doMouseDownClick" args="itemObj">
    	this.mouseDownClickUsed = true;
    	if ($debug) Debug.write("mouseDown CLICK Start Drag And Drop");
    	new lz.dragItemFLVExplorer(canvas,{
    		        dragItemResource:this.fileIcon,
            	    refObj:this,
                    x:canvas.getMouse('x'),
                    y:canvas.getMouse('y')
            	})
    </method>
    
    <method name="deleteFile" args="labelid">
    	new lz.confirmationSingle(canvas,{
                           refObj:this,
                           labelid:labelid,
                           labeliderror:713,
                           showCheckBox:false
                        });
    	//this.deleteFileOrFolder();
    </method>
    
    <method name="sendConfirmation" args="bool,askAgain">
        if (bool) {
            this.deleteFLVOrFolder.doCall();
        }
    </method>
    
    <netRemoteCallHib name="deleteFLVOrFolder" funcname="flvrecorderservice.deleteFLVOrFolder" 
        remotecontext="$once{ canvas.thishib }" > 
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.fileExplorerItemId;</method></netparam>
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("deleteFLVOrFolder: ",value);
            parent.parent.parent.doOpen();
            parent.refObjListRoot._selected = null;
            parent.refObjListRoot.parentFolderId = -2;
        </handler>
    </netRemoteCallHib> 
    
	<method name="doSingleClick" args="itemObj">
		this.singleClickStarted = false;
		//Cannot change name for Root Icons
		if (this.isRoot) {
            return;
        }
		this.addOrUpdateFolderName(this.fileExplorerItemId,false);
	</method>
	
	<!--
        Check if this is the Owner
     -->
    <method name="checkForIsOwner">
        if (this.isRoot) {
            return this.isOwner;
        } else {
            return parent.parent.checkForIsOwner();
        }
    </method>
    
    <!--
        Check if the user tries to move a file in its own tree,
        see moveFile
     -->
    <method name="checkForIsChild" args="compareFileExplorerItemId">
        if (this.isRoot) {
            return false;
        } else {
            if (this.fileExplorerItemId == compareFileExplorerItemId) {
                return true;
            } else {
                return parent.parent.checkForIsChild(compareFileExplorerItemId);
            }
        }
    </method>
	
	<method name="doResetSingleClick" args="itmeObj">
		this.singleClickStarted = false;
	</method>
	
	<method name="addFile">
		this.refObjListRoot.selectItem(this);
		this.refObjListRoot.addFile();
	</method>
	
	<method name="addFolder">
		if (this.isFolder) {
			if ($debug) Debug.write("NEW this.fileExplorerItemId INTO ",this);
			if ($debug) Debug.write("NEW this.fileExplorerItemId ",this.fileExplorerItemId);
			this.icon_folder_pre.setAttribute("frame",2);
            this.content.setAttribute("visibility","visible");
            this._folderIcon.setAttribute("frame",2);
    		var t = new lz.folderFLVExplorerItem(this.content,{
    			            isOwner:this.isOwner,
    			            isFolder:true,
                		    fileIcon:'icon_folder_rsc',
                            refObjListRoot:this.refObjListRoot,
                		    fileName:canvas.getLabelName(712)
                		});
            t.addOrUpdateFolderName(this.fileExplorerItemId,true);
		}
	</method>
	
	<method name="refresh">
		this.doOpen();
	</method>
	
	<method name="editFolderName">
		this.addOrUpdateFolderName(this.fileExplorerItemId,false);
	</method>
	
	<method name="loadFLV">
		this.refObjListRoot.loadFLV(this);
	</method>
	
	<method name="addOrUpdateFolderName" args="fileExplorerItemId,isNew">
		<![CDATA[
    		if ($debug) Debug.write("addOrUpdateFolderName ",fileExplorerItemId);
    		var tWidth = this._fileName.width;
    		if (tWidth < 160) {
    			tWidth = 160;
    		}
    		
    		var t = new lz.dynamicFLVName(canvas,{
    			        parentFileExplorerItemId:fileExplorerItemId,
    			        fileExplorerItemId:this.fileExplorerItemId, //Only used at update Name
    			        isOwner:this.isOwner,
    			        text:this.fileName,
    			        isNew:isNew, //false means its a renaming
    			        refObj:this,width:tWidth+10,
            		    x:this._fileName.getAttributeRelative("x",canvas),
            		    y:this._fileName.getAttributeRelative("y",canvas)
            		});
            		
            lz.Focus.setFocus(t,true);
            lz.ModeManager.makeModal(t);
            
        ]]>
	</method>
	
	<method name="toggleOpen" args="setSelection">
		if (this.mouseDownClickUsed) {
			if ($debug) Debug.write("mouseDownClickUsed RESET TO DEFAULT BUT DO NO ACTION Cause its a Drag and Drop Event");
			this.mouseDownClickUsed = false;
			return;
		}
		
		if (this.singleClickStarted) {
            if ($debug) Debug.write("Is this selected => Double Click !!!");
            this.singleClickStarted = false;
            lz.Timer.removeTimer( this.singleClickDelegate );
            if (this.isFolder) {
                this.doSingleClick(null);
            } else {
                this.loadFLV();
            }
        } else {
        	
        	if (this.isFolder){
        		if (!this.open) {
        			this.doOpen();
        		} else {
        			if (setSelection) {
            			if (this.selected) {
            				if ($debug) Debug.write("Is this selected => Do Edit !!!");
            				this.singleClickStarted = true;
            			    lz.Timer.addTimer( this.singleClickDelegate, 300 );
            			} else {
            				
            				this.singleClickStarted = true;
            				lz.Timer.addTimer( this.resetClickDelegate, 300 );
            			}
        			} else {
        				this.doClose();
        			}
        		}
        	} else {
        		if (setSelection) {
                    if (this.selected) {
                        if ($debug) Debug.write("Is this selected => Do Edit !!!");
                        this.singleClickStarted = true;
                        lz.Timer.addTimer( this.singleClickDelegate, 300 );
                    } else {
                        this.singleClickStarted = true;
                        lz.Timer.addTimer( this.resetClickDelegate, 300 );
                    }
                }
        	}
		}
		
		if (setSelection) this.refObjListRoot.selectItem(this);
	</method>
	
	<method name="selectItem">
		this.selected = true;
		this._fileName.setAttribute("bgcolor",canvas.getThemeColor('baseMousecolorizer'));
	</method>
	
	<method name="deselectItem">
		this.selected = false;
        if ($debug) Debug.write(this._fileName);
        this._fileName.setAttribute("bgcolor",0xFFFFFF);
    </method>
	
	<method name="clearContent">
        <![CDATA[
            for (var eg in this.content.subviews) {
                this.content.subviews[eg].destroy();
            }
        ]]>
    </method>
	
	<!--
	   public List<FileExplorerItem> getFileExplorerByParent(String SID, Long parentFileExplorerItemId, 
	               Long room_id, Boolean isOwner) {
     -->
	<netRemoteCallHib name="getFLVExplorerByParent" funcname="flvrecorderservice.getFLVExplorerByParent" 
        remotecontext="$once{ canvas.thishib }" >   
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.fileExplorerItemId;</method></netparam>  
        <netparam><method name="getValue">return parent.parent.isOwner;</method></netparam>         
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("getFLVExplorerByParent: ",value);
            parent.renderFilesAndFolders(value);
        </handler>
    </netRemoteCallHib>  
    
    <method name="renderFilesAndFolders" args="roomHome">
        <![CDATA[
            this.clearContent();
            
            //Folder area
            for (var i=0;i<roomHome.length;i++) {
                var fileExplorerItem = roomHome[i];
                
                if (fileExplorerItem.isFolder) {
                    new lz.folderFLVExplorerItem(this.content,{
                                            fileName:fileExplorerItem.fileName,
                                            fileExplorerItemId:fileExplorerItem.flvRecordingId,
                                            fileIcon:'icon_folder_rsc',
                                            refObjListRoot:this.refObjListRoot
                                        });
                } else {
                    new lz.flvExplorerItem(this.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.flvRecordingId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isImage:true,
                                            fileIcon:'file_explorer_video_rsc',
                                            refObjListRoot:this.refObjListRoot
                                        });
                }                
                
            }
            
        ]]>
    </method>
    
	
	<view name="icon_folder_pre" 
		  visibility="$once{ (parent.isFolder) ? 'visible' : 'hidden' }"
		  resource="icon_folder_pre_rsc" frame="1" >
		<handler name="onclick">
			parent.toggleOpen(false);
		</handler>
	</view>
	
	<view name="_folderIcon" resource="$once{ parent.fileIcon }" x="16" y="2" >
		<handler name="onmousedown">
			if (parent.isRoot) {
                return;
            }
            lz.Timer.addTimer( parent.mouseDownClickDelegate, 300 );
        </handler>
        <handler name="onmouseup">
        	if (parent.isRoot) {
                return;
            }
            lz.Timer.removeTimer( parent.mouseDownClickDelegate );
        </handler>
		<handler name="onclick">
			parent.toggleOpen(false);
		</handler>
	</view>
	
</class>


</library>
