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