<?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.
  
-->
<canvas width="100%" height="100%" title="OpenMeetings">
	
	<switch>
        <when property="$as3">
            <passthrough>
                import flash.net.*;
                import flash.display.*;
            </passthrough>
        </when>
    </switch>
	<switch>
		<when property="$debug">
			<method name="doDebugInit">
				canvas.setAttribute('debug', true);
			</method>
			<debug fontsize="11" oninit="Debug.showInternalProperties = true" width="40%" y="50%" x="60%" height="50%" />
		</when>
		<otherwise>
			<method name="doDebugInit">
			</method>
		</otherwise>
    </switch>
    
    <include href="testVideoObject.lzx" />

    <silverstyle name="componentStyle" basecolor="0xFFFFFF" textcolor="0x000000" />

    <attribute name="lc_SID"/>

    <attribute name="vid_lc_name" />

    <attribute name="lc"/>

    <attribute name="rtmp_lc_name" />

    <attribute name="rtmp_lc"/>

    <attribute name="videoComp_lc_name" />

    <attribute name="videoComp_lc_callback_name" />

    <attribute name="videoComp_lc" />

    <include href="base/" />

    <include href="modules/" />

    <include href="video/" />
    
    <include href="screensharing/" />
    
    <include href="audioVideoTest/" />
    
    <include href="lzrecorder/" />
    
    <include href="whiteboard/" />

    <include href="commonVideoViewContentSWF10.lzx" />

    <include href="hibAdapter.lzx" />

    <include href="miniIcons.lzx" />

    <include href="dragHelper.lzx" />

    <view name="mainComponent" width="${canvas.width}" height="${canvas.height}">
        <text id="mainBaseText"> </text>
    </view>

    <method name="getLCSID">
        //TODO: fixme
        return "" + Math.floor(999999*Math.random());
    </method>

    <handler name="oninit"><![CDATA[
		doDebugInit();
    
        var tInitArgsArry = new Array('secureHash','invitationHash','sid','roomid','directRoomId','language','hash','cuser','tAccept','moodleRoom','becomemoderator','wwwroot','user_id','picture','scopeRoomId');
    
        this.setAttribute('lc_SID', this.getLCSID());
        this.setAttribute('vid_lc_name', lc_SID + '__videoLC');
        this.setAttribute('rtmp_lc_name', lc_SID + '__rtmpLC');
        this.setAttribute('videoComp_lc_name', lc_SID + '__streamLC');
        this.setAttribute('videoComp_lc_callback_name', lc_SID + '__streamLC_cback');

        var videoComp_lc_cback:LocalConnection = new LocalConnection();
        videoComp_lc_cback.connect(this.videoComp_lc_callback_name);
        this.setAttribute('videoComp_lc',videoComp_lc_cback);
        
        var tqueryString = "";
        for (var i=0;i<tInitArgsArry.length;i++) {
            // if ($debug) Debug.write(tInitArgsArry[i],lz.Browser.getInitArg(tInitArgsArry[i]));
            var tValue = lz.Browser.getInitArg(tInitArgsArry[i]);
            if (tValue != undefined) {
                tqueryString += "&"+tInitArgsArry[i]+"="+tValue;
            }
        }
        
        var tSWFURL = "main" + ($debug ? "debug" : "") + ".swf8.swf?lzproxied=solo&lc_SID="+lc_SID+tqueryString;
        
        if ($debug) Debug.write("tSWFURL :: ",tSWFURL);
        
        var request:URLRequest = new URLRequest(tSWFURL);
        var loader:Loader = new Loader();
        loader.load(request);
        this.mainComponent.sprite.addChild(loader);

        new lz.commonVideoViewContentSWF10(this, {name:'_videoComponent'});
        new lz.hibAdapter(this);

    ]]></handler>

    <view name="inner"></view>
    
</canvas>
