<?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>
    
<!-- 
    The Width of each item is set in the participantList-Class
 -->
<class name="participantListItem" extends="view" bgcolor="0xDADADA" height="40" 
       showhandcursor="false">
    
    <attribute name="connectedSince" value="" type="string" />
    <attribute name="isMod" value="" type="string" />
    <attribute name="streamid" value="" type="string" />
    <attribute name="username" value="" type="string" />
    <attribute name="userroom" value="" type="string" />
    <attribute name="formatedDate" value="" type="string" />
    <attribute name="firstname" value="" type="string" />
    <attribute name="lastname" value="" type="string" />
    <attribute name="user_id" value="0" type="number" />
    <attribute name="isSuperModerator" value="false" type="boolean"/>
    <attribute name="refObj" value="null" />
    
    <handler name="oninit">
        <![CDATA[
            //this._userpic.setAttribute('src',downloadurl); 
            //This is a workaround cause in LPS-4.2.x immediatelly loading does not work
            lz.Timer.addTimer( new LzDelegate( this, "fadeText" ), 1000 );
                    
            if (canvas.publicSID == this.refObj.publicSID) {
                this._firstName.setAttribute("fontstyle","bold");
                this._lastName.setAttribute("fontstyle","bold");
            }
            
            this.updateIcons();
        ]]>
    </handler>
    
    <method name="fadeText" args="ignore=null"> 
        <![CDATA[
        	if ($debug) Debug.write("fadeText :1: ",this.refObj);
        	if ($debug) Debug.write("fadeText :2: ",this.refObj.picture_uri);
            this._userpic.setAttribute('src', canvas.getPictureUrl(this.refObj.picture_uri, '&moduleName=chat&remoteUserid='+this.user_id)); 
        ]]>          
    </method>
    
    <handler name="onismoderator" reference="canvas" args="m">
        if ($debug) Debug.write("###### ismoderator ",m);
        <![CDATA[
            this.isMod = canvas.getIsModeratorByPublicSID(this.refObj.publicSID);
            this.updateIcons();
        ]]>
    </handler>
    
    <handler name="ondrawAllowStatus" reference="canvas" args="drawObject">
        <![CDATA[
            if (this.refObj.publicSID == drawObject.publicSID) {
                this.refObj.canDraw = drawObject.canDraw;
                this.refObj.canShare = drawObject.canShare;
                this.refObj.canRemote = drawObject.canRemote;
                this.updateIcons();
            }
        ]]>
    </handler>

    <handler name="onexclusiveAudioAllowStatus" reference="canvas" args="rclObject">
        <![CDATA[
            if (this.refObj.publicSID == rclObject.publicSID) {
                this.refObj.canGiveAudio = rclObject.canGiveAudio;
                this.updateIcons();
            }
        ]]>
    </handler>
    
    <handler name="onmicMutedStatusChangedItem" reference="canvas" args="roomClientObj">
    	<![CDATA[
    	    if ($debug) Debug.write("onmicMutedStatusChangedItem :1: ",roomClientObj.publicSID);
            if (this.refObj.publicSID == roomClientObj.publicSID) {
            	if ($debug) Debug.write("onmicMutedStatusChangedItem :2: ",roomClientObj.micMuted);
                this.refObj.micMuted = roomClientObj.micMuted;
                this.updateIcons();
            }
        ]]>
    </handler>

    <handler name="onMute" reference="canvas.thishib.switchMicMuted" args="event">
        <![CDATA[
            if ($debug) Debug.write("onMute ", event.publicSID, event.mute);
            if(this.refObj.publicSID == event.publicSID) {
                this.refObj.micMuted = event.mute;
                this.updateIcons();
            }
        ]]>
    </handler>
    
    <!--
        Set actions to update the User-Rights and Information what he can do
     -->
    <method name="updateIcons">
        <![CDATA[
        
            if ($debug) Debug.write("updateByMod,",this.isMod,canvas.streamid);
        
            //If this is one Mod he can also draw on the Whitboard
            if (this.isMod) {
                
                
                this._miniIcons._isMod.setAttribute("visibility","visible");
                this._miniIcons._isModAddbutton.setAttribute("visibility","hidden");
                this._miniIcons._canDraw.setAttribute("visibility","visible");
                //the moderator can never remove the right to draw on the whiteboard for himself
                this._miniIcons._canDraw.setAttribute("showhandcursor",false);
                this._miniIcons._canDraw._text.setAttribute("text","");
                this._miniIcons._canDrawModerator.setAttribute("visibility","hidden");
                
                this._miniIcons._allowShare.setAttribute("visibility","visible");
                this._miniIcons._allowShare.setAttribute("showhandcursor",false);
                this._miniIcons._allowShare._text.setAttribute("text","");
                this._miniIcons._denyShare.setAttribute("visibility","hidden");
                
                this._miniIcons._allowRemote.setAttribute("visibility","visible");
                this._miniIcons._allowRemote.setAttribute("showhandcursor",false);
                this._miniIcons._allowRemote._text.setAttribute("text","");
                this._miniIcons._denyRemote.setAttribute("visibility","hidden");

                this._miniIcons._allowExclusiveAudio.setAttribute("visibility","visible");
                this._miniIcons._allowExclusiveAudio.setAttribute("showhandcursor",false);
                this._miniIcons._allowExclusiveAudio._text.setAttribute("text","");
                this._miniIcons._denyExclusiveAudio.setAttribute("visibility","hidden");
                
                if (canvas.ismoderator) {
                	this._x._kickUser.setAttribute("visibility","visible");
                    if (canvas.ismoderator && canvas.publicSID != this.refObj.publicSID) {
                        this._miniIcons._isMod.setAttribute("showhandcursor",true);
                        this._miniIcons._isMod._text.setAttribute("text",canvas.getLabelName(675));
                    } else {
                        this._miniIcons._isMod._text.setAttribute("text","");
                        this._miniIcons._isMod.setAttribute("showhandcursor",false);
                    }
                } else {
                	this._x._kickUser.setAttribute("visibility","hidden");
                    this._miniIcons._isMod._text.setAttribute("text","");
                    this._miniIcons._isMod.setAttribute("showhandcursor",false);
                }
                
            } else {
                this._miniIcons._isMod.setAttribute("visibility","hidden");
                    
                //if this User is the Moderator he can grant access to whiteboard to anybody
                if (canvas.ismoderator) {
                	this._x._kickUser.setAttribute("visibility","visible");
                    this._miniIcons._isModAddbutton.setAttribute("visibility","visible");
                    
                    
                    this._miniIcons._canDraw._text.setAttribute("text",canvas.getLabelName(612));
                    if (this.refObj.canDraw) {
                        //Only in THIS case you can remove the Draw-to-whiteboard right 
                        this._miniIcons._canDraw.setAttribute("visibility","visible");
                        this._miniIcons._canDraw.setAttribute("showhandcursor",true);
                        this._miniIcons._canDrawModerator.setAttribute("visibility","hidden");
                    } else {
                        this._miniIcons._canDraw.setAttribute("visibility","hidden");
                        this._miniIcons._canDraw.setAttribute("showhandcursor",false);
                        this._miniIcons._canDraw._text.setAttribute("text","");
                        this._miniIcons._canDrawModerator.setAttribute("visibility","visible");
                    }
                    
                  	this._miniIcons._allowShare._text.setAttribute("text",canvas.getLabelName(1068));
                    if (this.refObj.canShare) {
                    	this._miniIcons._allowShare.setAttribute("visibility","visible");
                        this._miniIcons._allowShare.setAttribute("showhandcursor",true);
                        this._miniIcons._denyShare.setAttribute("visibility","hidden");
                    } else {
                    	this._miniIcons._allowShare.setAttribute("visibility","hidden");
                        this._miniIcons._allowShare.setAttribute("showhandcursor",false);
                        this._miniIcons._denyShare.setAttribute("visibility","visible");
                    }
                    
                    this._miniIcons._allowRemote._text.setAttribute("text",canvas.getLabelName(1079));
                    if (this.refObj.canRemote) {
                    	this._miniIcons._allowRemote.setAttribute("visibility","visible");
                        this._miniIcons._allowRemote.setAttribute("showhandcursor",true);
                        this._miniIcons._denyRemote.setAttribute("visibility","hidden");
                    } else {
                    	this._miniIcons._allowRemote.setAttribute("visibility","hidden");
                        this._miniIcons._allowRemote.setAttribute("showhandcursor",false);
                        this._miniIcons._denyRemote.setAttribute("visibility","visible");
                    }

					this._miniIcons._allowExclusiveAudio._text.setAttribute("text",canvas.getLabelName(1425));
                    if (this.refObj.canGiveAudio) {
                    	this._miniIcons._allowExclusiveAudio.setAttribute("visibility","visible");
                        this._miniIcons._allowExclusiveAudio.setAttribute("showhandcursor",true);
                        this._miniIcons._denyExclusiveAudio.setAttribute("visibility","hidden");
                    } else {
                    	this._miniIcons._allowExclusiveAudio.setAttribute("visibility","hidden");
                        this._miniIcons._allowExclusiveAudio.setAttribute("showhandcursor",false);
                        this._miniIcons._denyExclusiveAudio.setAttribute("visibility","visible");
                    }
                    
                } else {
                	this._x._kickUser.setAttribute("visibility","hidden");
                    this._miniIcons._isModAddbutton.setAttribute("visibility","hidden");
                    
                    if (this.refObj.canDraw) {
                        this._miniIcons._canDraw.setAttribute("visibility","visible");
                    } else {
                        this._miniIcons._canDraw.setAttribute("visibility","hidden");
                    }
                    
                    if (this.refObj.canShare) {
                        this._miniIcons._allowShare.setAttribute("visibility","visible");
                    } else {
                        this._miniIcons._allowShare.setAttribute("visibility","hidden");
                    }
                    
                    if (this.refObj.canRemote) {
                        this._miniIcons._allowRemote.setAttribute("visibility","visible");
                    } else {
                        this._miniIcons._allowRemote.setAttribute("visibility","hidden");
                    }

                    if (this.refObj.canGiveAudio) {
                    	this._miniIcons._allowExclusiveAudio.setAttribute("visibility","visible");
                    } else {
                    	this._miniIcons._allowExclusiveAudio.setAttribute("visibility","hidden");
                    }
                    
                    //No Update action available
                    this._miniIcons._canDrawModerator.setAttribute("visibility","hidden");
                    this._miniIcons._denyShare.setAttribute("visibility","hidden");
                    this._miniIcons._denyRemote.setAttribute("visibility","hidden");
                    this._miniIcons._denyExclusiveAudio.setAttribute("visibility","hidden");
                    this._miniIcons._canDraw.setAttribute("showhandcursor",false);
                    this._miniIcons._canDraw._text.setAttribute("text","");
                    this._miniIcons._allowRemote._text.setAttribute("text","");
                    this._miniIcons._allowExclusiveAudio._text.setAttribute("text","");
                    this._miniIcons._allowShare._text.setAttribute("text","");
                    
                }
                    
            }
            
            if ($debug) Debug.write("onmicMutedStatusChangedItem :3: ",this.refObj.publicSID,this.refObj.micMuted);
            
            if (this.refObj.micMuted) {
            	this._x._mute._text.setAttribute("labelid",1408);
            	this._x._mute.setAttribute("frame",2);
            } else {
            	this._x._mute._text.setAttribute("labelid",1407);
            	this._x._mute.setAttribute("frame",1);
            }
            
            //this Icon is only available in case its the current User 
            if (canvas.publicSID == this.refObj.publicSID) {
                //if ($debug) Debug.write("IS SELF !!!!!!");
                this._miniIcons._restartDevice.setAttribute("visibility","visible");
            } else {
                this._miniIcons._restartDevice.setAttribute("visibility","hidden");
            }
        ]]>
    </method>
    
    <!--
    public Boolean setCanDraw(String SID, String publicSID, boolean canDraw)
     -->
     
    <netRemoteCallHib name="setCanDraw" funcname="whiteboardservice.setCanDraw"
                       remotecontext="$once{ canvas.thishib }">
        <netparam><method name="getValue"> return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.refObj.publicSID;</method></netparam>
        <netparam><method name="getValue">return !parent.parent.refObj.canDraw;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
            //The onResult-Handler will be called be the rtmpconnection
            //Debug.write("whiteboardservice.setCanDraw : ",value);
            
            ]]>
        </handler>   
    </netRemoteCallHib>  
            
    <netRemoteCallHib name="setCanShare" funcname="whiteboardservice.setCanShare"
                       remotecontext="$once{ canvas.thishib }">
        <netparam><method name="getValue"> return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.refObj.publicSID;</method></netparam>
        <netparam><method name="getValue">return !parent.parent.refObj.canShare;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
            //The onResult-Handler will be called be the rtmpconnection
            //Debug.write("whiteboardservice.setCanShare : ",value);
            
            ]]>
        </handler>   
    </netRemoteCallHib> 
    
    <netRemoteCallHib name="setCanRemote" funcname="whiteboardservice.setCanRemote"
                   remotecontext="$once{ canvas.thishib }">
        <attribute name="publicSID" value="" type="string" />
        <attribute name="canRemote" value="true" type="boolean" />
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.refObj.publicSID;</method></netparam>
        <netparam><method name="getValue">return !parent.parent.refObj.canRemote;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("whiteboardservice.setCanRemote : ",value);
            ]]>
        </handler>   
    </netRemoteCallHib>

    <netRemoteCallHib name="setCanGiveAudio" funcname="whiteboardservice.setCanGiveAudio"
                   remotecontext="$once{ canvas.thishib }">
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.refObj.publicSID;</method></netparam>
        <netparam><method name="getValue">return !parent.parent.refObj.canGiveAudio;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("setCanGiveAudio : ",value);
            ]]>
        </handler>
    </netRemoteCallHib>
            
    <handler name="onmouseover">
        this.setAttribute('bgcolor',canvas.getThemeColor('baseMousecolorizer'));
    </handler>
    
    <handler name="onmouseout">
        this.setAttribute('bgcolor',0xDADADA);
    </handler>
    
    <image name="_userpic" stretches="both" x="1">
        <handler name="onload">
            <![CDATA[
                if (this.height > 38) {
                    //If bigger then containter then scale it
                    var width = this.width/(this.height/38);
                    this.setAttribute('height',38);
                    this.setAttribute('width',width);
                }
                if (this.width > 38) {
                    //If bigger then containter then scale it
                    var height = this.height/(this.width/38);
                    this.setAttribute('height',height);
                    this.setAttribute('width',38);
                }
            ]]>
        </handler>
    </image>
    
    <labelText name="_firstName" fontsize="10" x="40" text="${ parent.firstname == null ? '' : parent.firstname }" />
    <labelText name="_lastName" fontsize="10" x="40" y="20" text="${ parent.lastname == null ? '' : parent.lastname }" />
    
	<miniIcons name="_start_private_chat_rsc" x="114" y = "2" width="16" height="16"
		resource="start_private_chat_rsc" showhandcursor="true"
		visible="${ (canvas.currentRoomObj.hideChat == null || !canvas.currentRoomObj.hideChat) &amp;&amp; parent.refObj.publicSID != canvas.publicSID }">
		
		<handler name="onclick">
			var refObj = parent.refObj;
			if ($debug) Debug.write("Start Private Chat: ", refObj);
			if (refObj.publicSID == canvas.publicSID) {
				new lz.labelerrorPopup(canvas.main_content._content.inner
					, {errorlabelid:1495});
				return;
			}
			canvas._currentChatPanel.addChat(refObj);
		</handler>
		<labelTooltip labelid="1493" />
	</miniIcons>
    
    <view name="_x" x="132" y="2">
	     
	    <miniIcons name="_mute" x="82" width="16" height="16" resource="mute_micro_btn_rsc" showhandcursor="true" >
            <handler name="onclick">
                <![CDATA[
                    canvas._videocontainer._videoviewcontent.muteSound(parent.parent.refObj.publicSID, !parent.parent.refObj.micMuted);
                ]]>
            </handler>
            <labelTooltip name="_text" text="" labelid="1407" />
        </miniIcons>  
        
	    <miniIcons name="_kickUser" width="16" height="16" x="100"
	               resource="kick_user_rsc" showhandcursor="true">
	        <handler name="onclick">
	        	
	        	if (parent.parent.refObj.publicSID == canvas.publicSID) {
	                new lz.labelerrorPopup(canvas.main_content._content.inner,{
	                            errorlabelid:1214
	                        });
	                return;
	            }
	                
	        	if (parent.isSuperModerator) {
	                new lz.labelerrorPopup(canvas.main_content._content.inner,{errorlabelid:1217});
	                return;
	            }
	        	
	            if ($debug) Debug.write("USER Kick: ",parent.parent.refObj.publicSID);
	            new lz.confirmationSingle(canvas.main_content._content.inner,{
	                                           labelid:1216,labeliderror:1215,
	                                           refObj:this,showCheckBox:false});
	            
	        </handler>
	        
	        <method name="sendConfirmation" args="yesno" >
	            this.kickUserByPublicSID.publicSID = parent.parent.refObj.publicSID;
	            this.kickUserByPublicSID.doCall();
	        </method>
	        
	        <netRemoteCallHib name="kickUserByPublicSID" funcname="userservice.kickUserByPublicSID" 
	                          remotecontext="$once{ canvas.thishib }" >    
	            <attribute name="publicSID" value="" type="string" />  
	            <netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
	            <netparam><method name="getValue"> return parent.publicSID; </method></netparam>
	            <handler name="ondata" args="value">
	                if ($debug) Debug.write("kickUserByPublicSID: ",value);
	                //this.parent.destroy();
	            </handler>
	        </netRemoteCallHib> 
	        
	        <labelTooltip labelid="1213" />
	    </miniIcons>   
    </view>
    
    <view name="_miniIcons" x="113" y="22" height="18" >
        
        <miniIcons name="_isMod" x="0" width="16" resource="right_isactive_rsc" 
                   height="16" showhandcursor="false">
            <handler name="onclick">
                <![CDATA[
                
                    if (parent.parent.isSuperModerator) {
                        new lz.labelerrorPopup(canvas.main_content._content.inner,{errorlabelid:838});
                        return;
                    }
                
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to draw on the whiteboard
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        //Do it 
                        if ($debug) Debug.write("Do Remove It");
                        hib.removeModerator.publicSIDOfNewModerator = parent.parent.refObj.publicSID;
                        hib.removeModerator.doCall();
                        //parent.parent.setCanDraw.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" text="" />
        </miniIcons>
        
        <miniIcons name="_isModAddbutton" opacity="0.5" x="0" width="16" resource="right_notactive_rsc" 
                   height="16" showhandcursor="true">
            <handler name="onclick">
                <![CDATA[
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to draw on the whiteboard
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        //Do it 
                        if ($debug) Debug.write("Do Add It");
                        hib.addModerator.publicSIDOfNewModerator = parent.parent.refObj.publicSID;
                        hib.addModerator.doCall();
                        //parent.parent.setCanDraw.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" labelid="676" />
        </miniIcons>
            
        <miniIcons name="_canDraw" x="20" width="16" resource="right_isactive_rsc" 
                   height="16" showhandcursor="false" >
            <handler name="onclick">
                <![CDATA[
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to draw on the whiteboard
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        //Do it 
                        if ($debug) Debug.write("Do add draw to it");
                        parent.parent.setCanDraw.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" text="" />
        </miniIcons>
        
        <miniIcons name="_canDrawModerator" x="20" width="16" opacity="0.5"
                   resource="right_notactive_rsc" height="16" showhandcursor="true">
            <handler name="onclick">
                //Do it 
                if ($debug) Debug.write("Do it");
                parent.parent.setCanDraw.doCall();
            </handler>
            <labelTooltip labelid="611" />
        </miniIcons>
        
        <miniIcons name="_allowShare" x="40" width="16" resource="right_isactive_rsc" 
                   height="16" showhandcursor="false" >
            <handler name="onclick">
                <![CDATA[
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to draw on the whiteboard
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        //Do it 
                        if ($debug) Debug.write("Do add draw to it");
                        parent.parent.setCanShare.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" text="" labelid="1068" />
        </miniIcons>
        
        <miniIcons name="_denyShare" x="40" width="16" opacity="0.5"
                   resource="right_notactive_rsc" height="16" showhandcursor="true">
            <handler name="onclick">
                //Do it 
                if ($debug) Debug.write("Do it");
                parent.parent.setCanShare.doCall();
            </handler>
            <labelTooltip labelid="1067" />
        </miniIcons>
        
        
        <miniIcons name="_allowRemote" x="60" width="16" resource="right_isactive_rsc" 
                   height="16" showhandcursor="false" >
            <handler name="onclick">
                <![CDATA[
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to draw on the whiteboard
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        //Do it 
                        if ($debug) Debug.write("Do add draw to it");
                        parent.parent.setCanRemote.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" text="" labelid="1079" />
        </miniIcons>
        
        <miniIcons name="_denyRemote" x="60" width="16" opacity="0.5"
                   resource="right_notactive_rsc" height="16" showhandcursor="true">
            <handler name="onclick">
                //Do it 
                if ($debug) Debug.write("Do it");
                parent.parent.setCanRemote.doCall();
            </handler>
            <labelTooltip labelid="1078" />
        </miniIcons>

        <miniIcons name="_allowExclusiveAudio" x="80" width="16" resource="right_isactive_rsc"
                   height="16" showhandcursor="false" >
            <handler name="onclick">
                <![CDATA[
                    //if the label is set and this is a Moderator then this user should
                    //allow the click event => the click event will trigger
                    //this user away from beeing able to give exclusive audio
                    if (canvas.ismoderator && this._text.text.length != 0) {
                        if ($debug) Debug.write("Do it");
                        parent.parent.setCanGiveAudio.doCall();
                    }
                ]]>
            </handler>
            <labelTooltip name="_text" text="" labelid="1425" />
        </miniIcons>

        <miniIcons name="_denyExclusiveAudio" x="80" width="16" opacity="0.5"
                   resource="right_notactive_rsc" height="16" showhandcursor="true">
            <handler name="onclick">
                parent.parent.setCanGiveAudio.doCall();
            </handler>
            <labelTooltip labelid="1424" />
        </miniIcons>
        
        
        <miniIcons name="_restartDevice" x="100" width="16" height="16" resource="resyncuser_rsc" showhandcursor="true">
            <handler name="onclick">
                //TODO: local connection call
                if ($debug) Debug.write("parent.parent.refObj.publicSID: ",parent.parent.refObj.publicSID);
                canvas._videocontainer._videoviewcontent.showDevicePopUp(true);
            </handler>
            <labelTooltip labelid="610" />
        </miniIcons>
        
        <view name="_loudness" x="120" >
            <view x="0" y="0" name="loudness" resource="speaking" opacity="0.2"
                  onmouseover="" onmouseout="" >      
			    <handler name="onclick">
					<![CDATA[
				      	if (canvas.ismoderator || canvas.isAllowedToGiveExclusiveAudio) {
				            canvas.thishib.giveExclusiveAudio.setExclusiveAudio(parent.parent.parent.refObj.publicSID);
				        } else {
				        	new lz.labelerrorPopup(canvas.main_content._content.inner,{errorlabelid:1478});    
				        }
					]]>
				</handler> 
                <labelTooltip inittwice="true" labelid="372" />
            </view>
        </view>    
    </view>
    
    <view name="divisionLine" width="$once{ parent.width }" 
          bgcolor="0xFFFFFF" height="1" y="39" />
    
</class>
 
</library>
