<?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="restrictedRoomSidebar" extends="view" width="280"
       height="${ canvas.height - 28 }" y="0" clip="true">
    
    <attribute name="selected" value="null" />
    
    <attribute name="isOpen" value="true" type="boolean"/>
    
    <attribute name="restricted" value="true" type="boolean" />
   
    <attribute name="listType" value="eventUserListTable" type="string" />
    
    <method name="doSelection" args="itemRef">
        <![CDATA[
        	if (itemRef.name == "filesTabButton") {
            	if (this.restricted) {
            		if (!canvas.ismoderator && !canvas.isAllowedToDraw) {
            			//Do not allow
            			new lz.labelerrorPopup(canvas,{errorlabelid:783});
            			return;
            		}
            	}
        	}
            	
            if (this.selected != null) {
                this.selected.deselect();
            }
            
            this.selected = itemRef;
            this.selected.select();
          
            if ($debug) Debug.write("this.selected.name ",this.selected.name, this.inited);
            
            if (this.selected.name == "userTabButton") {
                if ($debug) Debug.write("-- userTabButton");
                this._files.setAttribute("visibility","hidden");
                this._participants.setAttribute("visibility","visible");
            } else if (this.selected.name == "filesTabButton") {
                if ($debug) Debug.write("-- filesTabButton");
                this._files.setAttribute("visibility","visible");
                this._participants.setAttribute("visibility","hidden");
            }
        ]]>
    </method>
    
    <method name="toggleStatus">
        if (this.isOpen) {
            this._doClose.doStart();
            this.isOpen = false;
            this._minimizeSidebar._icon.setAttribute("frame",2);
            this._minimizeSidebar._icon._labelTooltip.setAttribute("labelid",857);
        } else {
            this._doOpen.doStart();
            this.isOpen = true;
            this._minimizeSidebar._icon.setAttribute("frame",1);
            this._minimizeSidebar._icon._labelTooltip.setAttribute("labelid",856);
        }
    </method>
    
    <view name="borderBarTop" y="0"
    			width="${ parent.width }" bgcolor="$once{ canvas.getThemeColor('mainBorderColor') }" height="1" />
   	<view name="_tabbarBg" width="${ parent.width }" height="32" y="1" bgcolor="0xFAFAFA" />
	<view name="borderBarBottom" y="34"
   			width="${ parent.width }" bgcolor="$once{ canvas.getThemeColor('mainBorderColor') }" height="1" /> 
    
    <view name="_head" y="1" width="${ parent.width-10 }" height="32"
    		  layout="axis:x;spacing:2;inset:2" >
    
    	<handler name="oninit">
    		for (var eg in this.subviews) {
            	this.subviews[eg].deselect();
            }
            this.userTabButton.doSelection();
    	</handler>
   
        <tabButtonMain name="userTabButton" height="$once{ parent.height }" width="$once{ (parent.width-6)/2 }"
                currentIconRsc="users_tab_btn" labelid="613" />
        
        <tabButtonMain name="filesTabButton" currentIconRsc="files_tab_btn" height="$once{ parent.height }" 
                labelid="614" width="$once{ (parent.width-6)/2 }"
                visible="${(canvas.currentRoomObj.hideFilesExplorer ? false:true)}"/>
        
    </view>
    
    <fileExplorer name="_files" y="22" width="$once{ parent.width-12 }" 
               height="${ parent.height-222 }" visibility="hidden" />
    
    <restrictedUserList name="_participants" y="36" 
			    width="$once{ parent.width-10 }" 
			   height="${ parent.height-((canvas.currentRoomObj.hideActivitiesAndActions == true) ? 36:236) }" />
			   
    <activityList name="_activityList" />
    
    <view name="_minimizeSidebar" x="${ parent.width - 10 }" width="10" y="1"
          				bgcolor="0xE0E1EB" height="${ parent.height-1 }">
        <handler name="onclick">
            parent.toggleStatus();
        </handler>
        
        <view width="${ parent.width }" height="$once{ parent.height }" 
               bgcolor="0xE0E1EB" >
        </view>
            
        <view name="_icon" resource="sidebar_tab_btn" y="0">
             <handler name="onclick">
	            parent.parent.toggleStatus();
	         </handler>
	         <labelTooltip name="_labelTooltip" labelid="856" />
        </view>
        
    </view>
    
    <animator name="_doOpen" attribute="width" to="$once{ parent.width }" 
              duration="750" start="false" />
              
    <animator name="_doClose" attribute="width" to="10" 
              duration="750" start="false" />
    
</class>

</library>
