<?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="pendingUserStatus" extends="view" bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }" 
	   width="$once{ parent.width-16 }" height="40" y="$once{ parent.height-62 }">
	
	<attribute name="message" value="" type="string" />
	<attribute name="userContactId" value="0" type="number" />

	<method name="setPendingStatus" args="pending">
        <![CDATA[
        
            if ($debug) Debug.write("setPendingStatus ",this.userContactId,pending);
            
            this.changePendingStatusUserContacts.pending = pending;
            this.changePendingStatusUserContacts.doCall();
        ]]>
    </method>
    
    <method name="close">
    	this.destroy();
    	parent.pendingUserStatusRef = null;
    </method>
    
    <!--
	public Long changePendingStatusUserContacts(String SID, Long userContactId, Boolean pending)
	 -->
    <netRemoteCallHib name="changePendingStatusUserContacts" funcname="userservice.changePendingStatusUserContacts" 
				  remotecontext="$once{ canvas.thishib }" activeErrorHandler="true" >      
		<attribute name="pending" value="true" type="boolean" />
		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
		<netparam><method name="getValue"> return parent.parent.userContactId; </method></netparam>
    	<netparam><method name="getValue"> return parent.pending; </method></netparam>
    	<handler name="ondata" args="value">
    		<![CDATA[
	    		if ($debug) Debug.write("changePendingStatusUserContacts: ",value);
	    		parent.parent.parent.parent._userContacts.reload();
    		]]>
    	</handler>
    </netRemoteCallHib>
    
    <view name="_bg" x="1" y="1" width="$once{ parent.width-2 }" height="$once{ parent.height-2 }"
    	  bgcolor="0xFFFFFF" />
    	  
	<miniIconsPresenter name="_close" x="$once{ parent.width-20 }" y="2"
        iconRessourceName="btn_presenter_close2">
        <handler name="onclick">
            this.parent.close();
        </handler>
        <labelTooltip labelid="430" />
    </miniIconsPresenter>  
    
	<miniIcons name="add" x="10" y="10" resource="user_moderator_list_apply_rsc" width="18" height="18" 
           showhandcursor="true">
		<handler name="onclick">
           parent.setPendingStatus(true);
        </handler>
        <labelTooltip labelid="1190" />
    </miniIcons>

	<miniIconsImage src="$once{ canvas.getThemeImage('button_cancel_rsc') }" 
				name="deny" x="30" y="10" width="18" height="18" 
           showhandcursor="true">
		<handler name="onclick">
            parent.setPendingStatus(false);
        </handler>
        <labelTooltip labelid="1191" />
    </miniIconsImage>
    
    <labelText text="$once{ parent.message }" y="10" x="60"
    		   width="$once{ parent.width-this.x-20 }" resize="false" multiline="true" />
    
</class> 
	

</library>
