<?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.setAttribute('started', true);
            this.isOpen = false;
            this._minimizeSidebar._icon.setAttribute("frame",2);
            this._minimizeSidebar._icon._labelTooltip.setAttribute("labelid",857);
        } else {
            this._doOpen.setAttribute('started', true);
            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">
		<![CDATA[
    		for (var eg in this.subviews) {
            	this.subviews[eg].deselect();
            }
            if (!canvas.currentRoomObj.hideFilesExplorer && canvas.currentRoomObj.filesOpened) {
				this.filesTabButton.doSelection();
			} else {
				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" started="false" />
              
    <animator name="_doClose" attribute="width" to="10" 
              duration="750" started="false" />
    
</class>

</library>
