<?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>

<class name="commonVideoComponentAdapter" extends="node">
	

    <handler name="oninit">
    	var t = this;
        canvas.videoComp_lc.lc_switchMicMuted = function(publicSID, tMute) {
            if ($debug) Debug.write("lc_switchMicMuted", publicSID, tMute);
            canvas.thishib.switchMicMuted.setMute(publicSID, tMute);
        };
        canvas.videoComp_lc.lc_giveExclusiveAudio = function(publicSID) {
            if ($debug) Debug.write("lc_giveExclusiveAudio", publicSID);
            canvas.thishib.giveExclusiveAudio.setExclusiveAudio(publicSID);
        };
        canvas.videoComp_lc.as3ConnectionSuccess = function() {
        	//FIXME: Throws a Null Pointer Exception if the parent view was already destroyed
        	t.parent.as3ConnectionSuccess();
        }
    </handler>
    
    <!---
        Show the popup with the possibility to choose the device settings
        @param isSyncUpdate show the popup also if the user has clicked the "do not show again" chceckbox
        @param interviewPodId the view id
        @param tx x-position
        @param ty y-position
        @param twidth width-position
        @param theight height-position
     -->
    <method name="showDevicePopUpInterview" args="isSyncUpdate,interviewPodId,tx,ty,twidth,theight">
    	if ($debug) Debug.write("showDevicePopUpInterview ",isSyncUpdate,interviewPodId,tx,ty,twidth,theight);
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "createEditRecordStream", [isSyncUpdate, true, interviewPodId]);
    </method>
    
    <!---
        Show the popup with the possibility to choose the device settings
        @param isSyncUpdate show the popup also if the user has clicked the "do not show again" chceckbox
     -->
    <method name="showDevicePopUp" args="isSyncUpdate">
    	if ($debug) Debug.write("showDevicePopUp ",isSyncUpdate);
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "createEditRecordStream", [isSyncUpdate, false, -1]);
    </method>
    
    <!---
        Invoked after the user enters the room to connect the SWF10 app to the server via rtmp(t/s)
     -->
    <method name="reconnectSuccess" args="isInterview">
    	if ($debug) Debug.write("Send reconnectSuccess to ",canvas.rtmp_lc_name);
    	canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "reconnectSuccess", [canvas.thishib.src, canvas.publicSID
    		, hib.userobject, isInterview, canvas.getHttpHost(), canvas.red5httpport]);
    </method>
    
    <handler name="onismoderator" reference="canvas" args="m">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "ismoderatorChanged", [m]);
    </handler>

    <!---
        Creates video object
    -->
    <method name="createVideo" args="publicSID,displayName,broadcastId,avsettings,interviewPodId,object">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "createVideo", [publicSID, displayName, broadcastId, avsettings, interviewPodId, object]);
    </method>

    <method name="createVideoObject" args="publicSID,isBroadcasting,interviewPodId,object">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "createVideoObject", [publicSID, isBroadcasting, interviewPodId,object]);
    </method>

    <!---
        invoked whenever a User starts to Stream Video in this Room,
        interviewPodId has only a meaning in the Room Type Interview
     -->
    <method name="startStream" args="publicSID,broadcastId,firstname,lastname,interviewPodId,vWidth,vHeight">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "startStream", [publicSID,broadcastId,firstname,lastname,interviewPodId,vWidth,vHeight]);
    </method>

    <!---
        invoked remotely by Red5-notification
        shows a green light if somebody is speaking
        @param string broadcastId broadcastId
        @param boolean bool show light on/off
    -->
    <method name="setSpeakingByPos" args="publicSID,bool">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "setSpeakingByPos", [publicSID, bool]);
    </method>

    <!---
        stops the streaming but does not destroy the view
        @param int broadcastId broadcastId
     -->
    <method name="closeStreamClient" args="publicSID">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "closeStreamClient", [publicSID]);
    </method>

    <!---
        stops the streaming but and destroys the view
        @param int broadcastId broadcastId
     -->
    <method name="disconnectclient" args="publicSID">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "disconnectclient", [publicSID]);
    </method>

    <method name="resetAllValues">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "resetAllValues",null);
    </method>

    <!---
     invoked if another client logs into the room
    after choosing devices -->
    <method name="setAVSettingsToClient" args="rcl">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "setAVSettingsToClient", [rcl]);
    </method>

    <method name="createEditRecordStream" args="syncUpdate"><![CDATA[
        //this.syncUpdate = syncUpdate;
        //h.getBroadCastId.doCall();
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "createEditRecordStream", [syncUpdate]);
    ]]></method>

    <method name="removeVideoByUser" args="publicSID">
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "removeVideoByUser", [publicSID]);
    </method>

    <!--
        Mutes/unmutes a sound of user's video
        with the publicSID
    -->
    <method name="muteSound" args="publicSID, bool">
    	if ($debug) Debug.write("muteSound :: ",publicSID,bool);
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "muteSound", [publicSID, bool]);
    </method>

    <method name="giveExclusiveAudio" args="publicSID">
    	if ($debug) Debug.write("giveExclusiveAudio :: ",publicSID);
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "giveExclusiveAudio", [publicSID]);
    </method>

    <!---
        Updates microphone's state of roomClient
    -->
    <method name="updateMuteStatusVideoView" args="roomClient">
    	if ($debug) Debug.write("updateMuteStatusVideoView :: ",roomClient);
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "updateMuteStatusVideoView", [roomClient]);
    </method>

    <!---
        Shows the window with device settings
    -->
    <method name="changeDevice">
    	if ($debug) Debug.write("changeDevice :: ");
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "changeDevice", null);
    </method>

    <!---
        Shows the exit dialog
    -->
    <method name="exitRoom">
    	if ($debug) Debug.write("exitRoom :: ");
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "exitRoom", null);
    </method>

    <!---
        Shows the close whiteboard dialog
    -->
    <method name="closeWhiteboard">
    	if ($debug) Debug.write("closeWhiteboard :: ");
        canvas.sendViaLocalConnection(canvas.vid_lc_name, "closeWhiteboard", null);
    </method>
</class>

</library>
