<?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="editPrivateMessageFolder" extends="customInputtext" 
	   fontsize="10" bgcolor="0xFFFFFF">
	
	<attribute name="privateMessageFolderId" value="0" type="number" />
	<attribute name="folderName" value="" type="string" />
	<attribute name="refObj" value="null" />
	
	<handler name="onblur">
		lz.ModeManager.release(this);
		if (this.folderName != this.getText()) {
			this.updatePrivateMessageFolder.doCall();
		} else {
			this.destroy();
		}
	</handler>
	
	<handler name="onkeydown" args="k">
		<![CDATA[
    		if (k == 13 || k == 27) {
    			this.onblur.sendEvent();
    		}
		]]>
	</handler>
	
	<!--
	public Long updatePrivateMessageFolder(String SID, Long privateMessageFolderId, String folderName)
	 -->
	<netRemoteCallHib name="updatePrivateMessageFolder" funcname="userservice.updatePrivateMessageFolder" 
			  remotecontext="$once{ canvas.thishib }" >  
		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
		<netparam><method name="getValue"> return parent.parent.privateMessageFolderId; </method></netparam>
    	<netparam><method name="getValue"> return parent.parent.getText(); </method></netparam>
    	<handler name="ondata" args="value">
    		<![CDATA[
	    		if ($debug) Debug.write("updatePrivateMessageFolder: ",value);
	    		parent.completed();
    		]]>
    	</handler>
    	<method name="sendConfirmation" args="yesno" >
            parent.parent.deleteFolder(parent.privateMessageFolderId,this);
        </method>
    </netRemoteCallHib>	
    
	<method name="completed">
		this.refObj.folderName = this.getText();
		this.refObj.updateConnectedFolderBox();
		this.refObj._text.setAttribute("text",this.getText());
		this.destroy();
	</method>
	
</class>	
	
<class name="privateMessageFolder" extends="view" x="16" width="136">
	
	<attribute name="folderName" value="" type="string" />
	<attribute name="privateMessageFolderId" value="0" type="number" />
	<attribute name="selected" value="false" type="boolean" />
	
	<handler name="onclick">
		if (this.selected) {
			this.editFolderName();
		}
		//this.setAttribute("enabled",false);
		parent.loadPrivateMessage(this.privateMessageFolderId,this);
	</handler>
	
	<method name="editFolderName">
		var t = new lz.editPrivateMessageFolder(canvas,{
    			        privateMessageFolderId:this.privateMessageFolderId,
    			        folderName:this.folderName,
    			        text:this.folderName,
    			        refObj:this,
    			        width:84,
    			        fontstyle:'bold',
    			        height:this.height,
            		    x:this._text.getAttributeRelative('x',canvas),
            		    y:this._text.getAttributeRelative('y',canvas)
            		});
            		
        lz.Focus.setFocus(t,true);
        lz.ModeManager.makeModal(t);
	</method>
	
	<!--
		Send update to drop down list of folder names 
	 -->
	<method name="updateConnectedFolderBox">
		parent.updateConnectedFolderBox();
	</method>
	
	<view resource="private_message_folder_rsc" x="0" y="0" />
	
	<labelText name="_text" fontstyle="bold" x="20" text="$once{ parent.folderName }" />
	
	<miniIcons name="edit" y="1" x="104" resource="paint" width="16" height="16" 
	               showhandcursor="true">
		<handler name="onclick">
			parent.editFolderName();
        </handler>
        <labelTooltip labelid="1264" />
    </miniIcons>
	
	<miniIconsImage src="$once{ canvas.getThemeImage('button_cancel_rsc') }" 
			name="deny" y="1" x="120" width="16" height="16" 
	               showhandcursor="true">
		<handler name="onclick">
			parent.getFolderCount.doCall();
        </handler>
        <labelTooltip labelid="1262" />
    </miniIconsImage>
    
    <!--
    public Long getFolderCount(String SID, Long privateMessageFolderId)
     -->
	<netRemoteCallHib name="getFolderCount" funcname="userservice.getFolderCount" 
			  remotecontext="$once{ canvas.thishib }" >  
		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
		<netparam><method name="getValue"> return parent.parent.privateMessageFolderId; </method></netparam>
    	<handler name="ondata" args="value">
    		<![CDATA[
	    		if ($debug) Debug.write("getFolderCount: ",value);
	    		if (value == 0) {
	    			new lz.confirmationSingle(canvas.main_content._content.inner,{
                                   labelid:1262,labeliderror:1265,
                                   refObj:this,showCheckBox:false});
	    		} else {
	    			new lz.labelerrorPopup(canvas,{errorlabelid:1263});
	    		}
    		]]>
    	</handler>
    	<method name="sendConfirmation" args="yesno" >
            parent.parent.deleteFolder(parent.privateMessageFolderId,this);
        </method>
    </netRemoteCallHib>	
						  
</class>	
	
</library>
