<?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="conferenceRoomSidebar" extends="view" width="280" bgcolor="$once{ canvas.getThemeColor('mainBackgroundColor') }" 
       height="${ canvas.height - ((canvas.currentRoomObj.hideTopBar) ? 0:28) }" y="0" clip="true">
    
    <attribute name="selected" value="null" />
    
    <attribute name="isOpen" value="true" type="boolean"/>
    
    <method name="doSelection" args="itemRef">
        <![CDATA[
            if (this.selected != null) {
                this.selected.deselect();
            }
            
            this.selected = itemRef;
            this.selected.select();
          
            if ($debug) Debug.write("this.selected.name ",this.selected.name);
            
            if (this.selected.name == "userTabButton") {
                if ($debug) Debug.write("-- userTabButton");
                this._files.setAttribute("visibility","hidden");
                this._videocontainer._applyAndStatusIcons.setAttribute("visibility","visible");
                this._videocontainer._participants.setAttribute("visibility","visible");
            } else if (this.selected.name == "filesTabButton") {
                if ($debug) Debug.write("-- filesTabButton");
                this._files.setAttribute("visibility","visible");
                this._videocontainer._applyAndStatusIcons.setAttribute("visibility","hidden");
                this._videocontainer._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" />
    
    <participants name="_videocontainer" 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>
