<?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>

<!-- 
#########################################

Test the setup values before you enter a room

 -->
 
<class name="simpleLabelRoundButtonIcon" extends="simpleLabelRoundButton" 
	   height="26" fontstyle="bold" >
	
	<attribute name="ressourceIcon" value="" type="string" />
	<attribute name="tlabelid" value="0" type="number" />
	
	<view name="_iconView" x="14" y="3" resource="$once{ parent.ressourceIcon }" />
	
	<labelText y="4" x="36" labelid="$once{ parent.tlabelid }" resize="true" />
	
	<handler name="onmouseover">
		this._iconView.setAttribute("opacity",0.5);
	</handler>
	
	<handler name="onmouseout">
        this._iconView.setAttribute("opacity",1);
    </handler>
    
</class> 
 
<class name="testSetup" extends="labelExplorerBox" labelid="757" allowDragging="false" 
    x="$once{ parent.width/2 - 300 }" y="100" docking="true" resizeable="false" 
    closable="false" width="600" height="400">

    <attribute name="roomClassName" type="string" value="" />
    
    <attribute name="roomObj" value="null"/>
    
    <attribute name="forceTest" value="false" type="boolean" />
    
    <attribute name="isDirectLink" value="false" type="boolean" />
    
    <!--- @keywords private if doJustClose is true the confirmation will be wait and 
    then the window just closed -->
    <attribute name="doJustClose" value="false" type="boolean" />
    
    <handler name="oninit">
    	<![CDATA[
            this.startConference();
            //The pre-test is disabled as its integrated into the choose device settings now
            return;
    	]]>
    </handler>
    
    <method name="justClose">
    	this._enterMeeting.setAttribute("enabled",false);
        this._cancel.setAttribute("enabled",false);
    	this.doJustClose = true;
        canvas._loadingAll.hideLoading();
        if ($debug) Debug.write("canvas.rtmp_lc_name", canvas.rtmp_lc_name, "closeInitTestingApplication");
        canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "closeInitTestingApplication", null);
    </method>
    
    <method name="closeInitTestingApplicationConfirm">
    	if ($debug) Debug.write("closeInitTestingApplicationConfirm ");
    	if (this.doJustClose) {	
    		this.close();
    	} else {
    		this.startConference();
    	}
    </method>
    
    <method name="storeSettings">
        <![CDATA[
            this._enterMeeting.setAttribute("enabled",false);
            this._cancel.setAttribute("enabled",false);
            canvas._loadingAll.hideLoading();
            canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "closeInitTestingApplication", null);
        
            Debug.write("sharedobject store ");
            var g = canvas.getUserData();
            g["showAudioVideoTest"] = this.holddatainSO.getValue();
            canvas.setUserData(g);
            
        ]]>
    </method>   
    
    <method name="startConference">
    	<![CDATA[
    	
            clearStageContent();
            
            if ($debug) Debug.warn("roomClassname : ", this.roomClassName);
            if ($debug) Debug.warn("canvas.currentRoomObj will be : ", this.roomObj);
            
            canvas.currentRoomObj = this.roomObj;
            
            this.close();
            
            new lz[this.roomClassName](canvas.main_content._content.inner, {
                        roomobj:this.roomObj
                    });
    	
    	]]>
    </method>

    <!-- Remember Me -->
    <labelCheckbox name="holddatainSO" labelid="759" x="10" y="$once{ parent.height-24 }" >
        <handler name="oninit">
            var g = canvas.getUserData();
            var save = g["showAudioVideoTest"];
            if ($debug) Debug.write("savecamdata save: ",save);
            if(save) this.setValue(true);
        </handler>
    </labelCheckbox>
    
    <simpleLabelButton name="_enterMeeting" labelid="761" width="160" x="$once{ parent.width-270 }" 
           y="$once{ parent.height-30 }" height="28" 
           onclick="this.parent.storeSettings();">
    </simpleLabelButton>
    
    <simpleLabelButton name="_cancel" labelid="760" width="100" x="$once{ parent.width-105 }" 
           y="$once{ parent.height-30 }" height="28"  
           onclick="this.parent.justClose();" />

</class>


</library>
