<?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="flexibleConferenceRoom" extends="baseConferenceRoom">

    <handler name="oninit">
    	
    	if (this.roomobj.hideTopBar == null || !this.roomobj.hideTopBar) {
            new lz.conferenceMenubar(canvas._conferencemenu);
            canvas._conferencemenu.setAttribute('visibility','visible');
    	} else {
    		canvas._mainbgcontentNavi.setAttribute('height',0);
            canvas.setAttribute('naviHeight',0);
            canvas.setAttribute('naviHeightDelta',0);
            canvas._conferencemenu.setAttribute('visibility','hidden');
            canvas._mainbgcontentNavi.setAttribute('visibility','hidden');            
    	}    	
    	
        new lz.moderationPanel(canvas._moderatormenu,{
                    name:'_moderationPanel',align:'right',
                    allowUserQuestions:this.roomobj.allowUserQuestions,
                    roomName:this.roomobj.name
                });          
        
        if(roomobj.appointment){
            canvas.appointmentNotificationPopUp = 
            	new lz.appointmentNotificationPopUp(canvas.conferenceView,{ 
            			name:'appDetail', roomobj:this.roomobj });    
        } else{
            if ($debug) Debug.write("no appointed meeting");
        }
        
        if (this.roomobj.isDemoRoom) {
            if (this.roomobj.demoTime != null) {
                if ($debug) Debug.warn("THIS IS A DEMO ROOM THAT SHOULD CLOSE AFTER SEC: ",this.roomobj.demoTime);
                this.meetingTimer = new lz.meetingTimer(canvas,{refObj:this,roomobj:this.roomobj});
            }
        }
        
        canvas.currentBaseConferenceRoom = this;
        
        this._chatPanelStrict.toggleopen();
        
    </handler>
    
    <handler name="ontabcontentleave">
        if ($debug) Debug.write("################# ontabcontentleave:",this);
        
        //close all screensharings, videos and closes the rtmp connection in the remote host
        this._screenSharingAdapter.closeAllScreenSharings();
        
        //reset the right to draw on WHiteboard as the RoomClient Object will be destroyed also
        //on server-Side the canDraw status will be false again when you relogin the same room
        canvas.isAllowedToDraw = true;
        
        _mainScrollBar.setAttribute("visibility","visible");
        
        //reset rights
        canvas.isAllowedToGiveExclusiveAudio = false;
        
        if (canvas._videocontainer!=null){
            canvas._videocontainer.resetAllValues();
            canvas._videocontainer = null;
        }
        if (canvas._chatcontent!=null){
            canvas._chatcontent = null;
        }
        if (canvas._mymod!=null){
            canvas._mymod = null;
        }
        
        if (this.meetingTimer != null) {
            this.meetingTimer.close();
        }
        
        if (canvas._drawarea.letterObjectIsActive){
            canvas._drawarea.currentletterObj.destroy();
        }
        
        if (canvas.currentFileExplorer != null) {
        	canvas.currentFileExplorer = null;
        }
        
        if (canvas.currentActivityList != null) {
        	canvas.currentActivityList = null;
        }
        
        //@deprecated we will not use old screen sharing implementation
        //canvas._screens.clearAllSessions();
        this.logicalRoomLeave.doCall();
        if ($debug) Debug.write("############ this.logicalRoomLeave ",this.logicalRoomLeave);
    </handler>
    
    

    <netRemoteCallHib name="logicalRoomLeave" funcname="logicalRoomLeave" remotecontext="$once{ canvas.thishib }" >
        <handler name="ondata" args="value">
            if ($debug) Debug.write("############# logicalRoomLeave: ",value);
            //this.parent.destroy();
            canvas.thishib.reconnectAfterRoomleft = true;
            canvas.thishib.reconnectedRoomInstance = this.parent;
            canvas.currentBaseConferenceRoom = null;
            
            // Reconnect User to default Scope
            canvas.thishib.userScope = "hibernate";
            var src = hib.getUrl();
            canvas.thishib.setAttribute('src',src);
            canvas.thishib.disconnect();
            canvas._mainbgcontentNavi.setAttribute('height',canvas.naviHeight);
            canvas.setAttribute('naviHeightDelta',canvas.naviHeight);
            canvas._conferencemenu.removeAll();
            canvas._conferencemenu.setAttribute('visibility','hidden');
        </handler>
    </netRemoteCallHib>
    
    <conferenceRoomSidebar name="_sidePanel" />
    
    <view name="_videoviewcontent_hideWhiteboard" y="0" x="${ parent._sidePanel.width }"
		  width="${canvas.width-parent._sidePanel.width}" height="${canvas.height-(parent._chatPanelStrict.height) - 
        ((parent._chatPanelStrict.visibility == 'hidden') ? 5:28) + ((canvas.currentRoomObj.hideTopBar) ? 28:0)}" clip="true" 
		  visibility="${((canvas.currentRoomObj.hideWhiteboard) ? 'visible':'hidden')}">
			<view name="_inn" width="${parent.width-10}">				
				<wrappinglayout axis="x" spacing="10"/>
			</view>
			<om_vscrollbar name="_attenddeescrollbar" visibility="visible"></om_vscrollbar>
	</view>
    
    <baseTabChatPanel name="_chatPanelStrict" labelid="616"
       height="200" x="${ parent._sidePanel.width }"  
       y="${ canvas.height - (this.height) - ((canvas.currentRoomObj.hideTopBar) ? 0:28)}" 
       width="${ canvas.width - parent._sidePanel.width }" />
       
    <fixedFileExplorerWhiteboardPanel name="_whiteboard" labelid="615"
        y="0" x="${ parent._sidePanel.width }" 
        width="${ canvas.width - parent._sidePanel.width }"
        height="${ canvas.height - (parent._chatPanelStrict.height) - 
        ((parent._chatPanelStrict.visibility == 'hidden') ? 6:28) + ((canvas.currentRoomObj.hideTopBar) ? 28:0)}" />
    
    <!--
        ###############################
        This is the container for all Videos
     -->
    <commonVideoViewContent name="_videoviewcontent" />
    
</class>

</library>
