<?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="pendingContactsListItem" extends="basePagingListItem" showhandcursor="false" height="40">
	
	<attribute name="username" value="" type="string" />
	
	<attribute name="searchUserProfileImage" value="null" />
	
	<handler name="onmouseover">
		<![CDATA[
			if (this.searchUserProfileImage != null) {
				this.searchUserProfileImage.destroy();
				this.searchUserProfileImage = null;
			}
			
			if (this.refObj != null) {
				this.searchUserProfileImage = new lz.searchUserProfileImage(canvas,{
						x:this.getAttributeRelative("x",canvas) - 120,
						y:this.getAttributeRelative("y",canvas) - 30,
						profileUrl: canvas.getPictureUrl(this.refObj.pictureuri
							, '&moduleName=remoteuserprofile&remoteUserid='+this.refObj.user_id)
					});
			}
		]]>
	</handler>
	
	<handler name="onmouseout">
		if (this.searchUserProfileImage != null) {
			this.searchUserProfileImage.destroy();
			this.searchUserProfileImage = null;
		}
	</handler>
	
	<turnOverTextItem name="_username" width="200" multiline="true"
					  text="${ parent.username }" />
					  
					  <!--
	<turnOverTextItem name="_timezone" width="80" multiline="true"
					  text="${ parent.timezone }" />
	<turnOverTextItem name="_searchOffers" width="300" multiline="true"
					  text="${ parent.searchOffers }" />
	<turnOverTextItem name="_searchSearchs" width="300" multiline="true"
					  text="${ parent.searchSearchs }" />
					   -->
	
	<view name="_icons" >
		
		<view visible="${ parent.parent.clickable }">
			
			<miniIcons name="add" y="1" x="1" resource="user_moderator_list_apply_rsc" width="18" height="18" 
	               showhandcursor="true">
				<handler name="onclick">
		            parent.parent.parent.parent.parent.parent.parent.setPendingStatus(parent.parent.parent.refObj.userContactId,true);
		        </handler>
		        <labelTooltip labelid="1190" />
		    </miniIcons>
	    
	    	<miniIconsImage src="$once{ canvas.getThemeImage('button_cancel_rsc') }" 
    				name="deny" y="1" x="20" width="18" height="18" showhandcursor="true">
				<handler name="onclick">
		            parent.parent.parent.parent.parent.parent.parent.setPendingStatus(parent.parent.parent.refObj.userContactId,false);
		        </handler>
		        <labelTooltip labelid="1191" />
		    </miniIconsImage>
		    
		    <miniIcons name="profile" y="1" x="40" resource="user_profile_rsc" width="18" height="18" 
	               showhandcursor="true">
		        <handler name="onclick">
		            if ($debug) Debug.write("Start Conference",parent.parent.parent.refObj.owner.user_id);
		            new lz.viewUserProfileWindow(canvas,{
				            	userId:parent.parent.parent.refObj.owner.user_id
				            });
		        </handler>
		        <labelTooltip labelid="1236" />
		    </miniIcons> 
		    
	    </view>
		
		<view height="$once{ parent.parent.height }" width="1" 
        	align="right" bgcolor="black" />
	</view>
	
</class>

</library>
