<?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 && refObj.isBroadcasting) {
			this._allowDevice.setAttribute("visibility","hidden");
			this._denyDevice.setAttribute("visibility","visible");
		} else {
			this._allowDevice.setAttribute("visibility","visible");
            this._denyDevice.setAttribute("visibility","hidden");
		}
		
		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="_allowDevice" x="80" width="40" 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.isAllowedToBroadCastAV = true;
            canvas.thishib.setBroadCastingFlag.doCall(); 
        </handler>
        <labelTooltip labelid="683" />
    </miniIcons>
    
    <miniIcons name="_denyDevice" x="80" width="40" 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.isAllowedToBroadCastAV = false;
            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>
