<?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="commonVideoViewContentSWF10" extends="view">

    <switch>
        <when property="$as3">
            <passthrough>
                import flash.net.LocalConnection;
            </passthrough>
        </when>
    </switch>

    <attribute name="offsetLength" type="number" value="40"/>
    <attribute name="videoWidth" type="number" value="132"/>
    <attribute name="videoHeight" type="number" value="132"/>
    <attribute name="SIDEPANEL_WIDTH" type="number" value="270" />
    
    <handler name="oninit">
        <![CDATA[

            var client = {};
            client.t = this;

            client.createEditRecordStream = this.createEditRecordStream;
            client.createVideoObject = this.createVideoObject;
            client.createVideo = this.createVideo;
            client.getVideoObjectByPublicSID = this.getVideoObjectByPublicSID;
            client.getNewVideoObject = this.getNewVideoObject;
            client.getVideoObjectFreePos = this.getVideoObjectFreePos;
            client.disconnectclient = this.disconnectclient;
            client.resetAllValues = this.resetAllValues;
            client.closeStreamClient = this.closeStreamClient;
            client.setSpeakingByPos = this.setSpeakingByPos;
            client.setAVSettingsToClient = this.setAVSettingsToClient;
            client.startStream = this.startStream;
            client.removeVideoByUser = this.removeVideoByUser;
            client.muteSound = this.muteSound;
            // client.videoOnMove = this.videoOnMove; function not in use ?! swagner 04.02.2012
            client.updateMuteStatusVideoView = this.updateMuteStatusVideoView;
            client.ismoderatorChanged = this.ismoderatorChanged;
            // update rights to SWF10 client
            client.updateModerationFlag = this.updateModerationFlag;
            client.changeDevice = this.changeDevice;
            client.setDrawAllowStatus = this.setDrawAllowStatus;
            client.setExclusiveAudioAllowStatus = this.setExclusiveAudioAllowStatus;
            client.exitRoom = this.exitRoom;
            client.closeWhiteboard = this.closeWhiteboard;

            var lc:LocalConnection = new LocalConnection();
            lc.connect(canvas.vid_lc_name);
            lc.client = client;
            canvas.setAttribute("lc", lc);

        ]]>
    </handler>
    
	<method name="createEditRecordStream" args="syncUpdate,isInterview,interviewPodId">
		if($debug) Debug.info("createEditRecordStream,",syncUpdate,isInterview,interviewPodId);
		if (canvas.inner.editRecordStream != null)
			canvas.inner.editRecordStream.destroy();
		new lz.editRecordStreamSWF10(canvas.inner, {
					name:"editRecordStream",
					isSyncUpdate:syncUpdate,
					isInterview:isInterview,
					interviewPodId:interviewPodId
				});
		return;
	</method>

	<!-- 
		Method that creates the video views when another user enters a room and his 
		item in the list of participants is created.
		The method to "play" the stream is invoked later, when the user
		really starts to stream and not only when he just enters the room.
	 -->
    <method name="createVideoObject" args="publicSID,isBroadcasting,interviewPodId,object">
        if($debug) Debug.info("createVideoObject, publicSID: ",publicSID, "isBroadcasting: ", isBroadcasting, "object", object);
        var vidContainer = getVideoObjectByPublicSID(publicSID);
        if(vidContainer == null) {
            vidContainer = isBroadcasting ? this.getNewVideoObject(publicSID) : this.getNewVideoObjectByPos(publicSID);
            vidContainer.publicSID = publicSID;
            
        }
        if ($debug) Debug.write("Is interview ? ",canvas.isInterview);
        if (canvas.isInterview) {
        	if ($debug) Debug.write("Is interview ",interviewPodId,"x",canvas["interviewPod"+interviewPodId+"_x"]);
        	vidContainer.setAttribute("interviewPodId", interviewPodId);
        	vidContainer.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
            vidContainer.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
            vidContainer.setAttribute("width",322);
            vidContainer.setAttribute("height",281);
        }
        vidContainer.clientVars = object;
        vidContainer.setAttribute('visibility','hidden');
        return vidContainer;
    </method>

	<!-- 
		
		Method that creates the video views when user(self) initially entering a room.
		Creates the video-view AND starts to stream/play the video
	 -->
    <method name="createVideo" args="publicSID,displayName,broadcastId,avsettings,interviewPodId,object">
        <![CDATA[
            if($debug) Debug.info("createVideo, publicSID: ",publicSID,"broadcastId: ",broadcastId,"AVsettings: ",avsettings);
            if ($debug) Debug.write(" createVideo ALL vars ",object);
            var vidContainer = getVideoObjectByPublicSID(publicSID);
            if(vidContainer == null) {
                vidContainer = this.getNewVideoObjectByPos(publicSID);
                vidContainer.clientVars = object;
                vidContainer.setAttribute('chatpartnername',displayName);
                if (avsettings=="n"){
                    vidContainer.setVideouserProfilePic(object);
                    vidContainer.setAttribute("visibility","hidden");
                } else if (avsettings=="a"){
                    vidContainer.setVideouserProfilePic(object);
                    if ($debug) Debug.warn("start play");
                    vidContainer._chatvideoinner._videostream.playStream(broadcastId,-1);
                    vidContainer.setAttribute("visibility","visible");
                } else if (avsettings=="v" || avsettings=="av") {
                    //this means avsettings is either: "v" or "av"
                	vidContainer.setDefaultVideoSize(object.VWidth,object.VHeight);
                    vidContainer._chatvideoinner._videostream.playStream(broadcastId,-1);
                    vidContainer.setAttribute("visibility","visible");
                } else {
                	//this means user did not select anything yet and streaming has not started
                	vidContainer.setAttribute("visibility","hidden");
                }
                vidContainer.setAttribute("interviewPodId", interviewPodId);
                vidContainer.updateAVSettingsSymbol(object);
                if (object.micMuted) {
            	    vidContainer.setMicMuted(object.micMuted);
           	 	}
            }
            
            
            if ($debug) Debug.write("Is interview ? ",canvas.isInterview);
            if (canvas.isInterview && interviewPodId != null && interviewPodId > 0) {
                if ($debug) Debug.write("Is interview ",interviewPodId,"x",canvas["interviewPod"+interviewPodId+"_x"]);
                vidContainer.setAttribute("interviewPodId", interviewPodId);
                vidContainer.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
                vidContainer.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
                vidContainer.setAttribute("width",322);
                vidContainer.setAttribute("height",281);
            }
			return;
        ]]>
    </method>
    
    <method name="getVideoObjectByPublicSID" args="publicSID">
    	<![CDATA[
    		if ($debug) Debug.write("getVideoObjectByPublicSid SEARCH: ",publicSID);
        	for (var i=0;i<this.subviews.length;i++){
        	    if ($debug) Debug.write("this.subviews[i].publicSID ",this.subviews[i].publicSID);
    			if (this.subviews[i].publicSID==publicSID){
    				return this.subviews[i];
    			}
    		}
    		if ($debug) Debug.warn(" - getVideoObjectByPublicSID - DID NOT FIND THE USER BY ",publicSID);
            return null;
    	]]>
    </method>

    <method name="getNewVideoObjectByPos" args="publicSID">
        <![CDATA[
            var obj = this.getVideoObjectByPublicSID(publicSID);
            if (obj!=null){
                return obj;
            }

            //Get a Free VideoView Slot
            var freePos = this.getVideoObjectFreePos(this.offsetLength,this.videoWidth,this.videoHeight);

            return new lz.videoObjectPlayBroadcast(this,{
                    publicSID:publicSID,
                    width:videoWidth,
                    height:videoHeight,
                    x:freePos[0],
                    y:freePos[1],
                    isInterview:canvas.isInterview
                });
        ]]>
    </method>

    <method name="getNewVideoObject" args="publicSID">
		<![CDATA[
			var obj = this.getVideoObjectByPublicSID(publicSID);
			if (obj!=null){
				this.broadCastViewRef = obj;
			} else {
                //Get a Free VideoView Slot
                var freePos = this.getVideoObjectFreePos(this.offsetLength,this.videoWidth,this.videoHeight);

				this.broadCastViewRef = new lz.videoObjectBroadcast(this,{
	                    publicSID:publicSID, width:videoWidth,height:videoHeight,
	                    x:freePos[0],
	                    y:freePos[1],
	                    isInterview:canvas.isInterview
                    });

				this.broadCastViewRef._chatvideoinner.r.destroy();
				if ($debug) Debug.write("getNewVideoObject canvas.userobject ",publicSID,canvas.userobject);
				this.broadCastViewRef.setAttribute('chatpartnername',canvas.userobject.firstname+' '+canvas.userobject.lastname);
			}
			return this.broadCastViewRef;
		]]>
	</method>

    <method name="getVideoObjectByInterviewPodId" args="interviewPodId">
        <![CDATA[
            for (var i=0;i<this.subviews.length;i++){
                if (this.subviews[i].interviewPodId==interviewPodId){
                    return this.subviews[i];
                }
            }
            if ($debug) Debug.warn(" - getVideoObjectByInterviewPodId - DID NOT FIND THE USER BY ",interviewPodId);
            return null;
        ]]>
    </method>

    <method name="getVideoObjectFreePos" args="offsetLength,videoWidth,videoHeight">
        <![CDATA[
            var newx = 20;
            if (canvas.currentRoomObject.hideWhiteboard) {
                newx += SIDEPANEL_WIDTH;
            }
            var newy = 0;
            var posFound = false;
            if (offsetLength == undefined) {
                offsetLength=10;
            }
            while (!posFound) {
                posFound = true;
                for (var i=0;i<this.subviews.length;i++){
                    var subview = this.subviews[i];
                    var left = subview.x;
                    var right = subview.x + subview.width;
                    var top = subview.y;
                    var bottom = subview.y + subview.height;

                    if( !(newx > right
                        || (newx + videoWidth) < left
                        || newy > bottom
                        || (newy + videoHeight) < top ))
                    {
                        newx = right + offsetLength;
                        posFound = false;
                    }
                    if ((newx + videoWidth) >= canvas.width) {
                        newx = 20;
                        if (canvas.currentRoomObject.hideWhiteboard) {
                            newx += SIDEPANEL_WIDTH;
                        }
                        newy += 10;
                        posFound = false;
                    }
                }
            }

            if ((newy + videoHeight) >= canvas.height) {
                newy = 0;
            }

            var result = [newx, newy];
            return result;
        ]]>
    </method>

    <method name="disconnectclient" args="publicSID">
        <![CDATA[
            if ($debug) Debug.write("disconnectclient: ",publicSID);

            var obj = this.getVideoObjectByPublicSID(publicSID);

            //if ($debug) Debug.write("disconnecclient obj: ",obj);
            if (obj == null) {
            	if ($debug) Debug.warn("Could Not find this To disconnect",publicSID);
            }

            if (obj != null){
                obj.resetValues();
                obj.destroy();
            }
        ]]>
    </method>

    <method name="muteSound" args="publicSID, bool">
        <![CDATA[
            var obj = this.getVideoObjectByPublicSID(publicSID);
            if (obj != null) {
                obj.silenceMicrophone(bool);
            }
            return;
        ]]>
    </method>

    <method name="resetAllValues">
        for (var eg in this.subviews){
            this.subviews[eg].resetValues();
        }
        return;
    </method>

    <method name="closeStreamclient" args="publicSID">
        <![CDATA[
            if ($debug) Debug.write("closeStreamthis: ",publicSID);
            var obj = this.getVideoObjectByPublicSID(publicSID);
            if ($debug) Debug.write("closeStreamthis obj: ",obj);
            if (obj != null){
                obj.resetValues();
            }
            return obj;
        ]]>
    </method>

    <method name="removeVideoByUser" args="publicSID"><![CDATA[
        var obj = this.closeStreamclient(publicSID);
        if(obj != null) {
            obj.destroy();
        }
        return;
    ]]></method>

    <method name="updateMuteStatusVideoView" args="roomClient">
        <![CDATA[
            for (var i=0;i<this.subviews.length;i++){
                this.subviews[i].muteMicrophone(roomClient);
    		}
    		return;
        ]]>
    </method>

    <method name="ismoderatorChanged" args="m">
        canvas.setAttribute("ismoderator", m);
        return;
    </method>


    <method name="setSpeakingByPos" args="publicSID,bool">
        <![CDATA[
            if ($debug) Debug.write("setSpeakingByPos ",publicSID,bool);
            var obj = this.getVideoObjectByPublicSID(publicSID);
            if (obj == null) {
            	if ($debug) Debug.warn("Could not find user for setSpeakingByPos ",publicSID,bool);
            	return;
            }
            if (bool){
                obj._loudness.loudness.setAttribute('opacity',1);
            } else {
                obj._loudness.loudness.setAttribute('opacity',0.2);
            }
            return;
        ]]>
    </method>

    <method name="setAVSettingsToClient" args="rcl">
        if ($debug) Debug.write("setAVSettingsToClient ",rcl.publicSID,rcl);
        var obj = this.getVideoObjectByPublicSID(rcl.publicSID);
        if ($debug) Debug.write("setAVSettingsToClient: ",obj,rcl.avsettings);
        if (obj == null) {
    		obj = this.getNewVideoObjectByPos(rcl.publicSID);
        }
        if (rcl.avsettings=="n"){
            obj.setAttribute("visibility","hidden");
            obj.setVideouserProfilePic(rcl);
        } else if (rcl.avsettings=="a"){
            obj.setVideouserProfilePic(rcl);
            obj.setAttribute("visibility","hidden");
        } else {
            obj.deleteVideoConfProfilePic(null);
            obj.setAttribute("visibility","visible");
        }
        obj.thisVars = rcl;
        obj.updateAVSettingsSymbol(rcl);
        return;
    </method>

    <method name="startStream" args="publicSID,broadcastId,firstname,lastname,interviewPodId,width,height">
        <![CDATA[
            if ($debug) Debug.write("startStream: ", publicSID,broadcastId,firstname,lastname,interviewPodId,width,height);
            var obj = this.getVideoObjectByPublicSID(publicSID);
            //if ($debug) Debug.write("startStream obj: ",obj);
            if (obj != null ){
                obj._chatvideoinner._videostream.playStream(broadcastId,-1);
                obj.setDefaultVideoSize(width,height);
                obj.setAttribute('chatpartnername',firstname+' '+lastname);
            }
            //we have to do this again when the stream starts, the initial video 
            //component does not know the interviewPodId as the user has not selected 
            //which interview video pod he is going to use
            if (canvas.isInterview && interviewPodId != null && interviewPodId > 0) {
                if ($debug) Debug.write("Is interview ",interviewPodId,"x",canvas["interviewPod"+interviewPodId+"_x"]);
                obj.setAttribute("interviewPodId", interviewPodId);
                obj.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
                obj.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
                obj.setAttribute("width",322);
                obj.setAttribute("height",281);
            }
            return;
        ]]>
    </method>

	<!---
		Clear all views, probably this is caleld whenever a user leaves the room for example
	 -->
    <method name="clearAll">
        <![CDATA[
            if ($debug) Debug.write("clearAll", this.subviews);
            while(this.subviews.length > 0) {
                this.subviews[0]._chatvideoinner._videostream._stop();
                this.subviews[0].destroy();
            }
            if (canvas.inner.editRecordStream != null) {
                canvas.inner.editRecordStream.destroy();
            }
            return;
        ]]>
    </method>
    
    <!---
    	Update the ismoderator flag, there is no need to check here which user
    	this happened already before sending it to the SWF10 app
     -->
    <method name="updateModerationFlag" args="moderator">
    	<![CDATA[
    		if ($debug) Debug.write("updateModerationFlag :: ",moderator);
    		this.setAttribute('ismoderator',moderator);
    		return;
    	]]>
    </method>
    
    <!---
    	Update the canDraw,canShare,canRemote flag, there is no need to check here which user
    	this happened already before sending it to the SWF10 app
     -->
    <method name="setDrawAllowStatus" args="canDraw,canShare,canRemote">
    	<![CDATA[
    		if ($debug) Debug.write("setDrawAllowStatus :: ",canDraw,canShare,canRemote);
    		canvas.setAttribute("isAllowedToDraw",canDraw);
            canvas.setAttribute("isAllowedToScreenShare",canShare);
            canvas.setAttribute("isAllowedToRemoteControl",canRemote);
            return;
    	]]>
    </method>
    
    <method name="setExclusiveAudioAllowStatus" args="canGiveAudio">
    	<![CDATA[
    		if ($debug) Debug.write("setExclusiveAudioAllowStatus :: ",canGiveAudio);
    		canvas.setAttribute("isAllowedToGiveExclusiveAudio",canGiveAudio);
            return;
    	]]>
    </method>

    <!---
        Shows the window with device settings
    -->
    <method name="changeDevice">
        <![CDATA[
            if ($debug) Debug.write("changeDevice");
            new lz.changeDevice(canvas.inner, {
					                name:"changeDeviceDialog"
					            });
            return;
        ]]>
    </method>

    <!---
        Shows the exit dialog
    -->
    <method name="exitRoom">
        if ($debug) Debug.write("exitRoom");
        new lz.confirmationSingleSWF10(canvas,{
                refObj:this,
                labelid:791,
                labeliderror:790,
                refReturnMethod:'exitConfirmMethod',
                showCheckBox:false
            });
        return;
    </method>
    
    <method name="exitConfirmMethod" args="bool,sharedObjectData">
    	canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'exitRoom', bool);
    </method>

    <!---
        Shows the close whiteboard dialog
    -->
    <method name="closeWhiteboard">
        if ($debug) Debug.write("closeWhiteboard");
        if (canvas.ismoderator || canvas.isAllowedToDraw) {
            canvas.closeWhiteboardDialog = new lz.confirmationSingleSWF10(canvas,{
                refObj:this,
                labeliderror:1313,
                refReturnMethod:'closeWhiteboardConfirmMethod',
                showCheckBox:false
            });
        } else {
            new lz.labelerrorPopupSWF10(canvas,{labelid:1366, errorlabelid:1365});
        }
        return;
    </method>
    
    <method name="closeWhiteboardConfirmMethod" args="bool,sharedObjectData">
    	canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'closeWhiteboard', bool);
    </method>
        
    <!--
    function not in use ?! swagner 04.02.2012
    <method name="videoOnMove" args="interviewPodId, x, y">
        if($debug) Debug.write("videoOnY: ", interviewPodId, y);
        var obj = getVideoObjectByInterviewPodId(interviewPodId);
        if($debug) Debug.write("getVideoObjectByInterviewPodId: ", interviewPodId, obj);
        if(obj != null) {
            obj.setAttribute('x', x);
            obj.setAttribute('y', y);
        }
    </method>
     -->

</class>

</library>
