<?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="dynamicFLVName" extends="customInputtext" 
	   fontsize="10" bgcolor="0xFFFFFF">
	
	<attribute name="isNew" value="false" type="boolean" />
	
	<!-- Only used in case its an update -->
	<attribute name="fileExplorerItemId" value="0" type="number" />
	
	<attribute name="parentFileExplorerItemId" value="0" type="number" />
	<attribute name="isOwner" value="false" type="boolean" />
	
	<attribute name="refObj" value="null" />
	
	<handler name="onblur">
		lz.ModeManager.release(this);
		if ($debug) Debug.write("Store and Destroy ",this.parentFileExplorerItemId);
		if (this.isNew) {
		    this.addFolder.doCall();
		} else {
			this.updateFileOrFolderName.doCall();
		}
	</handler>
	
	<handler name="onkeydown" args="k">
		<![CDATA[
    		if (k == 13 || k == 27) {
    			this.onblur.sendEvent();
    		}
		]]>
	</handler>
	
	<netRemoteCallHib name="addFolder" funcname="flvrecorderservice.addFolder" 
        remotecontext="$once{ canvas.thishib }" >   
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.parentFileExplorerItemId;</method></netparam> 
        <netparam><method name="getValue">return parent.parent.text;</method></netparam>   
        <netparam><method name="getValue">return parent.parent.isOwner;</method></netparam>    
        <netparam><method name="getValue">return hib.currentdomainObj.organisation_id;</method></netparam>       
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("addFolder: ",value);
            parent.completed(value);
        </handler>
    </netRemoteCallHib>  
	
	<netRemoteCallHib name="updateFileOrFolderName" funcname="flvrecorderservice.updateFileOrFolderName" 
        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.text;</method></netparam>   
        <handler name="ondata" args="value">    
            if ($debug) Debug.write("updateFileOrFolderName: ",parent.fileExplorerItemId);
            parent.completedRename();
        </handler>
    </netRemoteCallHib>
    
	<method name="completed" args="fileExplorerItemId">
		this.refObj.fileExplorerItemId = fileExplorerItemId;
		this.refObj.setAttribute("fileName",this.getText());
		this.refObj.parent.parent.doOpen();
		this.destroy();
	</method>
	
	<method name="completedRename">
		this.refObj.setAttribute("fileName",this.getText());
		this.destroy();
	</method>
	
</class>

</library>
