<?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>

<!--- list of conference/audience rooms -->
<class name="roomClientListItem" extends="baseContentListItem">
    
	<attribute name="streamid" value="0" type="number" />
	<attribute name="login" value="" type="string" />
	<attribute name="dateConnected" value="" type="string" />
    <attribute name="scope" value="" type="string" />
    <attribute name="serverId" value="0" type="number" />
    <attribute name="serverAddr" value="" type="string" />
    <attribute name="kickable" value="true" type="boolean" />
	
	<turnOverTextItem text="$once{ parent.streamid }" />
	<turnOverTextItem text="$once{ parent.login }" />
	<turnOverTextItem text="$once{ parent.dateConnected }" />
    <turnOverTextItem text="$once{ parent.scope }" />
    <simpleLabelButton labelid="603" enabled="${ parent.kickable }">
        <handler name="onclick">
            if ($debug) Debug.write("onclick ",this);
            new lz.confirmationSingle(canvas.main_content._content.inner,{labelid:604,labeliderror:605,refObj:this,showCheckBox:false});
        </handler>
        <method name="sendConfirmation" args="yesno" >
	        if ($debug) Debug.write("Kick that User");
            this.kickUserByStreamId.doCall();
	    </method>
        
        <netRemoteCallHib name="kickUserByStreamId" funcname="userservice.kickUserByStreamId" 
                          remotecontext="$once{ canvas.thishib }" >      
            <netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
            <netparam><method name="getValue"> return parent.parent.parent.streamid; </method></netparam>
            <netparam><method name="getValue"> return parent.parent.parent.serverId; </method></netparam>
            <handler name="ondata" args="value">
                if ($debug) Debug.write("kickUserByStreamId: ",value);
                //this.parent.destroy();
                if (value) {
                    parent.parent.destroy();
                }
            </handler>
        </netRemoteCallHib> 
    </simpleLabelButton>
    <turnOverTextItem text="$once{ parent.serverAddr }" />
    
    <labelTooltip name="_labelTooltip" multiline="false">
        <handler name="setContent">
        	if ($debug) Debug.write(parent.obj);
            this.setAttribute('text',"publicSID: "+parent.obj.publicSID);
        </handler>
    </labelTooltip>
	
</class>

</library>
