<?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.
  
-->

<!-- all attributes for main.lzx -->

<library>
	
	<!--- 
	   Audio-Video Quality Settings
		overwritten by values from the public/config.xml 
	 -->
	<attribute name="codecType" value="h264" type="string" />
	<attribute name="framesPerSecond" value="30" type="number" />
	<attribute name="bandwidthNeededNormal" value="16384" type="number" />
	<attribute name="bandwidthNeededBest" value="32768" type="number" />
	<attribute name="camQualityNormal" value="75" type="number" />
	<attribute name="camQualityBest" value="75" type="number" />
	<attribute name="microphoneRateBest" value="22" type="number" /> 
	<attribute name="echoPath" value="128" type="number" /> 
	<attribute name="echoSuppression" value="true" type="string" />
		

	<!--- 
        Holds a reference to the current VideoCOntainer Object
        containing the VideoViews
        and some more references to temp-objects
	 -->
	<attribute name="_videocontainer" value="null" />

	<attribute name="currentNC" value="null" />

	<attribute name="currentRoomObject" value="null"/>

	<attribute name="userobject" value="null"/>

	<attribute name="webAppRootKey" value="" type="string" />
	
	<!--- 
		URL/IP to use for the Server for HTTP and HTTPS traffic.
	    If this value is empty it will use the rtmphostlocal 
	    variable (and in that way try to connect to the 
	    domain-name the OpenMeetings-Client has been loading from)
	 -->
	<attribute name="httphostlocal" value="" type="string" />
	
	<!--- 
	    Port to use for the Server
	    This port is used to connect to the HTTP-Servlet
	    of the Red5-Servlet
	 -->
	<attribute name="red5httpport" value="5080" type="string" />

	<attribute name="httpRootKey" value="/" type="string" />
	
	<attribute name="protocol" value="/" type="string" />
	
	<attribute name="proxyType" value="none" type="string" />

	<!---
		A reference to the current screenSharingDialogContainer or 
		null if there is nothing to stream
	 -->
	<attribute name="screenSharingDialogContainer" value="null" />
	
	<!--
	    this value indicates if this user is allowed to draw to the Whiteboard
	    If this user is currently Moderator => he ALWAYS can draw to whiteboard
	    even if this isAllowedToDraw == false
	 -->
	<attribute name="isAllowedToDraw" value="false" type="boolean" />
	
	<attribute name="isAllowedToScreenShare" value="false" type="boolean" />
	
	<attribute name="isAllowedToRemoteControl" value="false" type="boolean" />
	
	<attribute name="isAllowedToGiveExclusiveAudio" value="false" type="boolean" />
	
	<attribute name="ismoderator" value="false" type="boolean" />
	
	<attribute name="isInterview" value="false" type="boolean" />
	
	<!--
	   Those values are fixed values of the video positions of the videos from the interview room type
	 -->
	<attribute name="interviewPod1_x" value="320" type="number" />
	<attribute name="interviewPod1_y" value="28" type="number" />
	
	<attribute name="interviewPod2_x" value="644" type="number" />
    <attribute name="interviewPod2_y" value="28" type="number" />
    
    <!-- 
		Holds a reference to the current tooltip, if there is one
	 -->
	<attribute name="currentToolTip" value="null" />
	
	<!-- Attributes for wicket login (since it hard not to break anything)-->
	<attribute name="wicketsid" type="string" />
	<attribute name="wicketroomid" value="0" type="number" />
	
	<!-- Attributes for show chat dialog when screen sharing open-->
	<attribute name="chatHeight" value="0" type="number" />
	
	<method name="registerToolTip" args="viewInstance">
		if (this.currentToolTip != null) {
			this.currentToolTip.cleanHolder();
		}
		this.currentToolTip = viewInstance;
	</method>
	
	<method name="clearToolTip">
		if (this.currentToolTip != null) {
			this.currentToolTip.cleanHolder();
			this.currentToolTip = null;
		}
	</method>

</library>
