<?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>
    
<dataset name="myresultnavi" />

<dataset name="languagesSet" />        

<dataset name="countrySet" />
<dataset name="timeZoneSet" />

<class name="userStatus" extends="view" width="250" height="30">
    <attribute name="statusText" type="string" />
    <attribute name="statusColor" type="number" value="0" />

    <text name="status" width="240" height="20" x="5" y="5" fontstyle="bold" fgcolor="0" text="defaulttext" fontsize="10"/>

    <handler name="oninit">
        this.status.setAttribute("text", this.statusText);
        this.status.setAttribute("fgcolor", this.statusColor);
        this.setAttribute("visibility", "visible");
        lz.Timer.addTimer( new LzDelegate( this, "selfDestroy" ), 3000 );
    </handler>

    <method name="selfDestroy" args="ignore=null">
        this.destroy();
    </method>
</class>

<class name="hibRtmpConnection" extends="rtmpConnection" debug="false" src="" >

     <!--
        The onconnect Method is triggered several times:
             - When you enter a room the NetConnection will close and reconnect to the Scope of the Room
             - When you leave the room again it will be re-connected to the default scope again
      -->
     <handler name="onconnect">
		if($debug) Debug.info("hibRtmpConnection/onconnect send to LocalConnection ");
		canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'as3ConnectionSuccess');
		
		//reset rights
        canvas.isAllowedToGiveExclusiveAudio = false;
        // this.overwritePublicSID.doCall();
        //this.setUsernameReconnect.doCall();
    </handler>

    <netRemoteCallHib name="overwritePublicSID" funcname="overwritePublicSID" >
    	<netparam><method name="getValue"> return canvas.publicSID;</method></netparam>
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("overwritePublicSID: ",value);
        </handler>
    </netRemoteCallHib>

    <handler name="onerror" args="value">
        if ($debug) Debug.write("Connection error ",value);
        // this.connect();
    </handler>
    
</class>

<hibRtmpConnection name="thishib" id="hib" />

</library>
