<?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="moderationMiniIconRestricted" extends="view" y="20" x="2" height="18">
	
	<attribute name="isMod" value="false" type="boolean"/>
    <attribute name="isSuperModerator" value="false" type="boolean"/>
	
	<handler name="oninit">
	<![CDATA[
		this.isMod = parent.parent.isMod;
		this.isSuperModerator = parent.parent.isSuperModerator;
		
		if ($debug) Debug.write(" :: moderationMiniIconRestricted :. ",this.isMod);
		var refObj = parent.parent.refObj;
		
		if (this.isMod) {
			this._isMod.setAttribute("visibility","visible");
			this._isModAddbutton.setAttribute("visibility","hidden");
		} else {
			this._isMod.setAttribute("visibility","hidden");
            this._isModAddbutton.setAttribute("visibility","visible");
		}
		
		if (this.isMod) {
			this._canDraw.setAttribute("visibility","visible");
            this._canDraw.isActive = false;
            this._canDraw.setAttribute("showhandcursor",false);
            this._canDraw._text.setAttribute("text",canvas.getLabelName(681));
            this._canDrawModerator.setAttribute("visibility","hidden");
		} else {
			if (refObj != null && refObj.canDraw) {
                this._canDraw.setAttribute("visibility","visible");
                this._canDraw.isActive = true;
                this._canDraw.setAttribute("showhandcursor",true);
                this._canDraw._text.setAttribute("text",canvas.getLabelName(612));
                this._canDrawModerator.setAttribute("visibility","hidden");
            } else {
                this._canDraw.setAttribute("visibility","hidden");
                this._canDrawModerator.setAttribute("visibility","visible");
            }
		}
		
		if (this.isMod) {
			this._allowScreen.setAttribute("visibility","visible");
            this._allowScreen.isActive = false;
            this._allowScreen.setAttribute("showhandcursor",false);
            this._allowScreen._text.setAttribute("text",canvas.getLabelName(1069));
            
            this._allowRemote.setAttribute("visibility","visible");
            this._allowRemote.isActive = false;
            this._allowRemote.setAttribute("showhandcursor",false);
            this._allowRemote._text.setAttribute("text",canvas.getLabelName(1083));

            this._allowExclusiveAudio.setAttribute("visibility","visible");
            this._allowExclusiveAudio.isActive = false;
            this._allowExclusiveAudio.setAttribute("showhandcursor",false);
            this._allowExclusiveAudio._text.setAttribute("text",canvas.getLabelName(1083));
            
            this._denyScreen.setAttribute("visibility","hidden");
            this._denyRemote.setAttribute("visibility","hidden");
            this._denyExclusiveAudio.setAttribute("visibility","hidden");
		} else {
			
			if ($debug) Debug.write("refObj.canShare :: ", (refObj != null && refObj.canShare));
		
			if (refObj != null && refObj.canShare) {
    			this._allowScreen.setAttribute("visibility","visible");
                this._allowScreen.isActive = true;
                this._allowScreen.setAttribute("showhandcursor",true);
                this._allowScreen._text.setAttribute("text",canvas.getLabelName(1068));
                this._denyScreen.setAttribute("visibility","hidden");
			} else {
				this._allowScreen.setAttribute("visibility","hidden");
				this._denyScreen.setAttribute("visibility","visible");
			}
			
			if (refObj != null && refObj.canRemote) {
    			this._allowRemote.setAttribute("visibility","visible");
                this._allowRemote.isActive = true;
                this._allowRemote.setAttribute("showhandcursor",true);
                this._allowRemote._text.setAttribute("text",canvas.getLabelName(1079));
                this._denyRemote.setAttribute("visibility","hidden");
			} else {
				this._allowRemote.setAttribute("visibility","hidden");
				this._denyRemote.setAttribute("visibility","visible");
			}

            if (refObj != null && refObj.canGiveAudio) {
    			this._allowExclusiveAudio.setAttribute("visibility","visible");
                this._allowExclusiveAudio.isActive = true;
                this._allowExclusiveAudio.setAttribute("showhandcursor",true);
                this._allowExclusiveAudio._text.setAttribute("text",canvas.getLabelName(1425));
                this._denyExclusiveAudio.setAttribute("visibility","hidden");
            } else {
				this._allowExclusiveAudio.setAttribute("visibility","hidden");
				this._denyExclusiveAudio.setAttribute("visibility","visible");
            }
		}
		
		if (refObj != null) {
			this._allowDevice.setAttribute("visible", !refObj.isBroadcasting || !refObj.canVideo);
			this._denyDevice.setAttribute("visible", refObj.isBroadcasting && refObj.canVideo);

			this._allowAudio.setAttribute("visible", !refObj.isBroadcasting);
			this._denyAudio.setAttribute("visible", refObj.isBroadcasting);
		}
		
		if ($debug) Debug.write("Set micMuted ", (refObj != null && refObj.micMuted));
		
		if (refObj != null && refObj.micMuted) {
			this._muteDevice.setAttribute("visibility","hidden");
            this._unMuteDevice.setAttribute("visibility","visible");
		} else {
			this._muteDevice.setAttribute("visibility","visible");
            this._unMuteDevice.setAttribute("visibility","hidden");
		}
		
		this._start_private_chat_rsc.setAttribute('visible'
			, (canvas.currentRoomObj.hideChat == null || !canvas.currentRoomObj.hideChat)
				&& (refObj != null && refObj.publicSID != canvas.publicSID));
	]]>
	</handler>
        
    <miniIcons name="_isMod" x="0" width="16" showhandcursor="true"
    		   resource="participants_isMod_rsc" height="16">
        <handler name="onclick">
            <![CDATA[
            
                if (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) {
                    //Do it 
                    if ($debug) Debug.write("Do Remove It");
                    if (parent.parent.parent.refObj.publicSID != canvas.publicSID) {
                        hib.removeModerator.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
                        hib.removeModerator.doCall();
                    } else {
                    	new lz.labelerrorPopup(canvas,{errorlabelid:682});
                    }
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="675" />
    </miniIcons>
    
    <miniIcons name="_isModAddbutton" opacity="0.5" x="0" showhandcursor="true"
    		   width="16" resource="participants_isMod_rsc" height="16">
        <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) {
                    //Do it 
                    if ($debug) Debug.write("Do Add It");
                    hib.addModerator.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
                    hib.addModerator.doCall();
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="676" />
    </miniIcons>
        
    <miniIcons name="_canDraw" x="20" width="16" resource="participants_allow_drawing_rsc"
               height="16" showhandcursor="false" >
    	<attribute name="isActive" value="true" type="boolean" />
        <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.isActive) {
                    //Do it 
                    if ($debug) Debug.write("Do add draw to it");
                    canvas.thishib.setCanDraw.publicSID = parent.parent.parent.refObj.publicSID;
                    canvas.thishib.setCanDraw.canDraw = false;
                    canvas.thishib.setCanDraw.doCall();
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="612" />
    </miniIcons>
    
    <miniIcons name="_canDrawModerator" x="20" width="16" opacity="0.5"
               resource="participants_allow_drawing_rsc" height="16" showhandcursor="true">
        <handler name="onclick">
            //Do it 
            if (canvas.ismoderator) {
                if ($debug) Debug.write("Do it");
                canvas.thishib.setCanDraw.publicSID = parent.parent.parent.refObj.publicSID;
                canvas.thishib.setCanDraw.canDraw = true;
                canvas.thishib.setCanDraw.doCall();
            }
        </handler>
        <labelTooltip labelid="611" />
    </miniIcons>
    
    <miniIcons name="_allowScreen" x="40" width="16" height="16" 
               resource="screen_allow_rsc" showhandcursor="true">
    	<attribute name="isActive" value="true" type="boolean" />
        <handler name="onclick">
        	<![CDATA[
                if ($debug) Debug.write("Deny Screen: ",parent.parent.parent.refObj.publicSID);
                if (canvas.ismoderator && this.isActive) {
                	canvas.thishib.setCanShare.publicSID = parent.parent.parent.refObj.publicSID;
                    canvas.thishib.setCanShare.canShare = false;
                    canvas.thishib.setCanShare.doCall();
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="1068" />
    </miniIcons>
    
    <miniIcons name="_denyScreen" x="40" width="16" height="16"  opacity="0.5"
               resource="screen_allow_rsc" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("Allow Screen: ",parent.parent.parent.refObj.publicSID);
            if (canvas.ismoderator) {
                canvas.thishib.setCanShare.publicSID = parent.parent.parent.refObj.publicSID;
                canvas.thishib.setCanShare.canShare = true;
                canvas.thishib.setCanShare.doCall();
            }
        </handler>
        <labelTooltip labelid="1067" />
    </miniIcons>  
    
     <miniIcons name="_allowRemote" x="60" width="16" height="16" 
               resource="remote_allow_rsc" showhandcursor="true">
    	<attribute name="isActive" value="true" type="boolean" />
        <handler name="onclick">
        	<![CDATA[
                if ($debug) Debug.write("Deny Screen: ",parent.parent.parent.refObj.publicSID);
                if (canvas.ismoderator && this.isActive) {
                	canvas.thishib.setCanRemote.publicSID = parent.parent.parent.refObj.publicSID;
                    canvas.thishib.setCanRemote.canRemote = false;
                    canvas.thishib.setCanRemote.doCall();
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="1079" />
    </miniIcons>
    
    <miniIcons name="_denyRemote" x="60" width="16" height="16"  opacity="0.5"
               resource="remote_allow_rsc" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("Allow Screen: ",parent.parent.parent.refObj.publicSID);
            if (canvas.ismoderator) {
                canvas.thishib.setCanRemote.publicSID = parent.parent.parent.refObj.publicSID;
                canvas.thishib.setCanRemote.canRemote = true;
                canvas.thishib.setCanRemote.doCall();
            }
        </handler>
        <labelTooltip labelid="1078" />
    </miniIcons>        
    
    <miniIcons name="_allowAudio" x="80" width="16" height="16" resource="a_allow_rsc" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("ALLOW: ",parent.parent.parent.refObj.publicSID);
            canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
            canvas.thishib.setBroadCastingFlag.canVideo = false;
            canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = true;
            canvas.thishib.setBroadCastingFlag.doCall(); 
        </handler>
        <labelTooltip labelid="1604" />
    </miniIcons>
    <miniIcons name="_denyAudio" x="80" width="16" height="16" resource="a_deny_rsc" opacity="0.5" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("ALLOW: ",parent.parent.parent.refObj.publicSID);
            canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
            canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = false;
            canvas.thishib.setBroadCastingFlag.doCall(); 
        </handler>
        <labelTooltip labelid="1605" />
    </miniIcons>
    <miniIcons name="_allowDevice" x="100" width="16" height="16" resource="av_allow_rsc" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("ALLOW: ",parent.parent.parent.refObj.publicSID);
            canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
            canvas.thishib.setBroadCastingFlag.canVideo = true;
            canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = true;
            canvas.thishib.setBroadCastingFlag.doCall(); 
        </handler>
        <labelTooltip labelid="683" />
    </miniIcons>
    
    <miniIcons name="_denyDevice" x="100" width="16" height="16" resource="av_deny_rsc" opacity="0.5" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("ALLOW: ",parent.parent.parent.refObj.publicSID);
            canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = parent.parent.parent.refObj.publicSID;
            canvas.thishib.setBroadCastingFlag.canVideo = false;
            canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = true;
            canvas.thishib.setBroadCastingFlag.doCall(); 
        </handler>
        <labelTooltip labelid="684" />
    </miniIcons>
    
    <miniIcons name="_muteDevice" x="120" width="16" height="16" resource="mute_btn_rsc" 
    				opacity="0.5" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("mute: ",parent.parent.parent.refObj.publicSID);
            canvas._videocontainer._videoviewcontent.muteSound(parent.parent.parent.refObj.publicSID, true);
        </handler>
        <labelTooltip labelid="1384" />
    </miniIcons>
    
    <miniIcons name="_unMuteDevice" x="120" width="16" height="16" resource="unmute_btn_rsc" 
    		   showhandcursor="true" visibility="hidden">
        <handler name="onclick">
            if ($debug) Debug.write("unmute: ",parent.parent.parent.refObj.publicSID);
            canvas._videocontainer._videoviewcontent.muteSound(parent.parent.parent.refObj.publicSID, false);
        </handler>
        <labelTooltip labelid="1385" />
    </miniIcons>

    <miniIcons name="_allowExclusiveAudio" x="136" width="16" height="16"
               resource="participants_exclusive_audio_rsc" showhandcursor="true">
    	<attribute name="isActive" value="true" type="boolean" />
        <handler name="onclick">
        	<![CDATA[
                if ($debug) Debug.write("Deny Give Exclusive Audio: ",parent.parent.parent.refObj.publicSID);
                if (canvas.ismoderator && this.isActive) {
                    canvas.thishib.setCanGiveAudio.sendValue(parent.parent.parent.refObj.publicSID,false);
                }
            ]]>
        </handler>
        <labelTooltip name="_text" labelid="1425" />
    </miniIcons>

    <miniIcons name="_denyExclusiveAudio" x="136" width="16" height="16" opacity="0.5"
               resource="participants_exclusive_audio_rsc" showhandcursor="true">
        <handler name="onclick">
            if ($debug) Debug.write("Allow Give Exclusive Audio: ",parent.parent.parent.refObj.publicSID);
            if (canvas.ismoderator) {
                canvas.thishib.setCanGiveAudio.sendValue(parent.parent.parent.refObj.publicSID,true);
            }
        </handler>
        <labelTooltip labelid="1424" />
    </miniIcons>
    
	<miniIcons name="_kickUser" x="154" width="16" height="16"
               resource="kick_user_rsc" showhandcursor="true">
        <handler name="onclick">
        	
        	if (parent.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.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.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);
            </handler>
        </netRemoteCallHib> 
        
        <labelTooltip labelid="1213" />
    </miniIcons>              
    
	<miniIcons name="_start_private_chat_rsc" x="172" y="2" width="16" height="16" resource="start_private_chat_rsc" showhandcursor="true">
		
		<handler name="onclick">
			var refObj = parent.parent.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>
</class>

</library>
