<?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="restrictedUserListItem" extends="basePagingListItem" showhandcursor="false" width="254" height="42">
	
	<attribute name="connectedSince" value="" type="string" />
	
    <attribute name="isMod" value="false" type="boolean" />
    
    <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="refObj" value="null" />
    
    <attribute name="isSuperModerator" value="false" type="boolean"/>
    
    <attribute name="userpicURL" value="" type="string" />
    <attribute name="userpicView" value="null" />
    
    <attribute name="selfItem" value="false" type="boolean"/>
    
    <method name="update" args="obj">
    	setAttribute('firstname', obj.firstname);
    	setAttribute('lastname', obj.lastname);
    	refObj = obj;
    </method>
     
    <handler name="onisMod">
    	<![CDATA[
        	if (this.isMod) {
                this._content.userStatus.setAttribute("frame",3);
            } else if (this.refObj != null && this.refObj.canDraw) {
                this._content.userStatus.setAttribute("frame",2);
            } else {
                this._content.userStatus.setAttribute("frame",1);
            }
        ]]>
    </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.updateModeratorIcons();
            }
        ]]>
    </handler>

	<method name="updateIconByMod">
		if (this.clickable) {
        	this.isMod = canvas.getIsModeratorByPublicSID(this.refObj.publicSID);
        	//if ($debug) Debug.write(" :: updateIconByMod :: ",this.isMod)
        	if (this.isMod) {
                this._content.userStatus.setAttribute("frame",3);
            } else if (this.refObj.canDraw) {
            	this._content.userStatus.setAttribute("frame",2);
            } else {
            	this._content.userStatus.setAttribute("frame",1);
            }
		}
    </method>  
    
    <method name="updateIconByModScroll">
    	if (this.clickable) {
        	if (this.isMod) {
                this._content.userStatus.setAttribute("frame",3);
            } else if (this.refObj.canDraw) {
            	this._content.userStatus.setAttribute("frame",2);
            } else {
            	this._content.userStatus.setAttribute("frame",1);
            }
    	}
    </method>  
    
    <method name="initModeratorIcons">
    	//if ($debug) Debug.write(" :1: initModeratorIcons :: ");
    	if (canvas.ismoderator) {
    		//if ($debug) Debug.write(" :2: initModeratorIcons :: ");
			this._content._iconsModerator.setAttribute("visibility","visible");
			this._content._iconsModerator.oninit.sendEvent();
    	}
    </method>
    
    <method name="updateModeratorIcons">
		if (this._content._iconsModerator.visibility == "visible") {
            this._content._iconsModerator.oninit.sendEvent();
		}
    </method>
    
    <method name="hideModeratorIcons">
    	if (this._content._iconsModerator.visibility == "visible") {
            this._content._iconsModerator.setAttribute("visibility","hidden");
    	}
    </method>

	<method name="userTyping" args="v">
		this._content._user_typing.setAttribute("visible", v);
	</method>
	<view name="_content" width="254">
		<view name="_contentIsCurrent" visible="${ parent.parent.selfItem }" width="254" height="40" bgcolor="0x7CFC00"/>
          
    	<labelText name="_userName" x="2" y="2" text="${ (parent.parent.firstname == null ? '' : parent.parent.firstname) + ' ' + (parent.parent.lastname == null ? '' : parent.parent.lastname) }" />
    		   
		<typingIcon name="_user_typing" x="132" y="2" width="30" height="16" visible="false"/>
		<miniIcons name="_restartDevice" x="220" y="0" width="16" height="16" resource="resyncuser_rsc" showhandcursor="true"
				visible="${ parent.parent.clickable &amp;&amp; parent.parent.selfItem &amp;&amp; canvas.isBroadCasting }">
			<handler name="onclick">
				if ($debug) Debug.write("parent.parent.refObj.publicSID: ",parent.parent.refObj.publicSID);
				canvas._videocontainer._videoviewcontent.showDevicePopUp(true);
			</handler>
			<labelTooltip labelid="610" />
		</miniIcons>
		<view name="userStatus" visible="${ parent.parent.clickable }" x="238" frame="1" resource="userstatus_multiframe_rsc" />
	    	
	    <moderationMiniIconRestricted name="_iconsModerator" visibility="hidden"/>
	</view>
</class>

</library>
