<library>
<!--
  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.
  
-->

<!---
	extends the baseVideoStream with functions to catch Device Events
	this Class uses Events from the Base Class baseVideoStream
	onmicro and oncamera, which are thrown, once a device was set
 -->

<class name="baseVideoStreamDevice" extends="baseVideoStream">

    <switch>
        <when property="$as3">
            <passthrough>
                import flash.events.StatusEvent;
                import flash.events.ActivityEvent;
            </passthrough>
        </when>
    </switch>

	<!--- Shows if there is Activity on the Microphone -->
	<attribute name="micactive" value="false" type="boolean" />
	
    <!--- Level delegate, used to track level changes. 
          @keywords private -->
    <attribute name="_leveldel" value="$once{new LzDelegate(this, '_updateLevel')}"/>
    
    <!--- Audio level, 0-100, the amount of sound detected by this microphone.
          Reset to 0 when there is no audio (no activity or not allowed).
          @keywords readonly -->
    <attribute name="level" type="number" value="0"/>    
        	
	<!--- Shows if there is Activity on the Camera -->
	<attribute name="camactive" value="false" type="boolean" />
	
	<!--- 
	Message to send to Clients
	 -->
	<attribute name="objMessage" value="null" />
	<!--- 
		indicates if the message should be send, you can change the notification 
		level by changing the loudnessAcitviation in the config.xml
	 -->
	<attribute name="isgreater" value="false" type="boolean" />     
	
	<attribute name="doSendNotification" value="true" type="boolean" />	
	
	<!---
	   If true the component will send an event via LocalConnection 
	   when sound is louder or less 5%
	 -->
	<attribute name="sendNotificationViaLocalConnection" value="true" type="boolean" />
	
	<event name="sendCameraStatus" />
    
    <event name="sendMicroStatus" />
    
	<handler name="oncamera" args="c">
		//if ($debug) Debug.write("Cam: ",c);
        c.addEventListener(ActivityEvent.ACTIVITY, onActivity);
        c.addEventListener(StatusEvent.STATUS, onStatus);
	</handler>

    <method name="onStatus" args="stats">
        if ($debug) Debug.write("CamStatus: ",stats);
        this.sendCameraStatus.sendEvent(stats.code);
    </method>

    <method name="onActivity" args="event">
        this.setAttribute("camactive", event.activating);
    </method>
	
	<handler name="onmicro" args="m">
		//if ($debug) Debug.write("Mic: ",m);
		var t = this;
        m.addEventListener(ActivityEvent.ACTIVITY, onMicActivity);
        m.addEventListener(StatusEvent.STATUS, onMicStatus);
	</handler>

    <method name="onMicStatus" args="stats">
    	if ($debug) Debug.write("onMicStatus 1: ",stats);
        this.sendMicroStatus.sendEvent(stats.code);
    </method>

    <method name="onMicActivity" args="event">
        //if ($debug) Debug.write("onMicActivity: ",event);
        this.setAttribute("micactive", event.activating);
    </method>
	
		<!--- Handler for the Flash Microphone onActivity callback. 
              @keywords private -->
	<handler name="onmicactive">
		<![CDATA[
            if (this.onlevel) {
                if (this.micactive) {
                    this._leveldel.register(lz.Idle, "onidle");
                } else {
                    this._leveldel.unregisterAll();
                    this.setAttribute("level", 0);
                }
            }
		]]>
	</handler>
	
	<!--- Handler for updating the microphone activity level attribute. 
			  @keywords private -->
	<method name="_updateLevel" args="arg">
		<![CDATA[
			if (this.micro == null) {
				return;
			}
			var level = this.micro.activityLevel;
			if (level < 0) {
				level = 0;
			}

			if (level != this.level) {
				this.setAttribute("level", level);
			}
		]]>
	</method>	
	
    <!-- 
	    these methods send a Notification to all Connected users of a 
	    Room about the onActivity-Change
     -->
	<handler name="onlevel" args="level">
		<![CDATA[
		
		    //if ($debug) Debug.write("onlevel ",this.level,level);
		
		    if (!this.doSendNotification){
		    	return;
		    }
		    
		    var tVal = null;
		
    		//greater 5 means the green dot starts to blink if the loudness is greater then 5%
    		//it makes no sense to set this to zero as there will be 1000 of events send 
    		//per minute to change the status just of this icon, swagner 12.02.2012
			if (level>8) {
				tVal = true;
			} else {
				tVal = false;
			}
			
			if (this.isgreater != tVal) {
				if ($debug) Debug.write("Level sendNotification ",this.isgreater,tVal,level);
				this.isgreater = tVal;
				this.sendNotification();
			}
			
		]]>
	</handler>    
	
	
	<method name="sendNotification">
		//if ($debug) Debug.write("Level sendNotification ",this.isgreater);
		if (!this.sendNotificationViaLocalConnection) {
		  return;
		}
  		this.objMessage = new Array ();
  		this.objMessage[0] = 'audioActivity';
  		this.objMessage[1] = this.isgreater;
  		this.objMessage[2] = parent.parent.publicSID;
  		//if ($debug) Debug.write("Level sendNotification ",this.objMessage);
  		this.sendMessage.doCall();
	  	//canvas.videoComp_lc.send(canvas.videoComp_lc_name, "sendNotification", this.objMessage);
	</method>
	
	<netRemoteCallHib name="sendMessage" funcname="sendMessage" 
        remotecontext="$once{ canvas.thishib }" showLoading="false" > 
        <netparam><method name="getValue"> return parent.parent.objMessage; </method></netparam>
    </netRemoteCallHib>     

</class>


</library>
