<?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;
                import flash.external.ExternalInterface;
            </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.toggleVideo = this.toggleVideo;
            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.getVideoObjectCount = this.getVideoObjectCount;
            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.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.immediateExitRoom = this.immediateExitRoom;
            client.closeWhiteboard = this.closeWhiteboard;
            client.arrangeWindows = this.arrangeWindows;
            client.updateFirstLastName = this.updateFirstLastName;
            client.setSessionId = this.setSessionId;

            var lc:LocalConnection = new LocalConnection();
            lc.connect(canvas.vid_lc_name);
            lc.client = client;
            canvas.setAttribute("lc", lc);

        ]]>
    </handler>
    
	<method name="toggleVideo" args="value">
		if($debug) Debug.info("toggleVideo ", value);
		canvas.userobject.canVideo = value;
	</method>
    
	<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"]);
			if (interviewPodId != null) {
				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("visible", false);
                } 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 {
				this.broadCastViewRef = getNewVideoObjectByPos(publicSID);

				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="getVideoObjectCount" args="a">
	<![CDATA[
		var count = 0;
		for (var i = 0; i < this.subviews.length; ++i) {
			if (this.subviews[i].visible) {
				count++;
			}
		}
		//if ($debug) Debug.debug("COUNT :: ", count);
		canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'onInterviewPodCount', count);
	]]>
	</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[
		var obj = this.getVideoObjectByPublicSID(roomClient.publicSID);
		if (obj != null) {
			obj.muteMicrophone(roomClient);
		}
	]]>
	</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;
		}
		obj._loudness.setSpeaking(bool);
	]]>
	</method>

	<method name="setAVSettingsToClient" args="rcl">
	<![CDATA[
		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 ("n" == rcl.avsettings){
			obj.setVideouserProfilePic(rcl);
		} else if ("a" == rcl.avsettings){
			obj.setVideouserProfilePic(rcl);
		} else {
			obj.deleteVideoConfProfilePic();
		}
		obj.thisVars = rcl;
		obj.updateAVSettingsSymbol(rcl);
		var v = ("a" == rcl.avsettings && obj.isInterview) || ("a" != rcl.avsettings && rcl.avsettings != "n");
		obj.setAttribute("visible", v);
		obj.setAttribute("visibility", v ? "visible" : "hidden");
		if ($debug) Debug.write("setAVSettingsToClient: ", v, obj.visible);
	]]>
	</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:'immediateExitRoom',
                showCheckBox:false
            });
        return;
    </method>

	<method name="immediateExitRoom" args="bool,ctx">
	<![CDATA[
		if($debug) Debug.write("0");
		if (canvas.wicketsid != null && bool) {
			if($debug) Debug.write("1");
			clearAll();
			if($debug) Debug.write("2");
			canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'exitRoom', bool);
			if($debug) Debug.write("3");
			if($debug) Debug.write("Do disconnect 10:: ", canvas.thishib);
			if (canvas.thishib._nc) {
				canvas.thishib._nc.close();
			}
			if($debug) Debug.write("4");
			canvas.thishib.disconnect();
			if($debug) Debug.write("5");
			canvas.thishib.src = null;
		}
	]]>
	</method>

	<method name="updateFirstLastName" args="publicSID,first,last">
		var v = getVideoObjectByPublicSID(publicSID);
		if (v != null) {
			v.setAttribute('chatpartnername', first + ' ' + last);
		}
	</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>
        
	<!-- arranges video pods -->
	<method name="arrangeWindows">
	<![CDATA[
		if ($debug) Debug.write("arrangeWindows");
		var windowsList = this.subviews;

		if (0 == windowsList.length) {
            return;
		}

        windowsList.sort(this.sortFunction);

		var offsetInPx = 40;
		var initX = 20;
		var initY = 20;
		var xPos = initX;
		var yPos = initY;
		var rowHeight = windowsList[0].height;

		// arrange windows with new positions
		for (var winIdx = 0; winIdx < windowsList.length; winIdx++) {
			var window = windowsList[winIdx];
			if (canvas.width < xPos + window.width) {
                yPos += rowHeight + offsetInPx;
                xPos = initX;
                rowHeight = window.height;
			}
			if (canvas.height < yPos) {
			    initX += 10;
			    initY += 10;
			    xPos = initX;
			    yPos = initY;
			}
			window.setAttribute("x", xPos);
			window.setAttribute("y", yPos);
			window.bringToFront();

			xPos += window.width + offsetInPx;
		}
	]]>
	</method>

	<method name="setSessionId" args="session_id">
		canvas.setAttribute("sessionId", session_id);
	</method>
	
    <!-- @keyword private -->
    <method name="sortFunction" args="el1, el2">
        <![CDATA[
            if (el1.height > el2.height) {
                return -1;
            } else if (el1.height < el2.height) {
                return 1;
            }
            return 0;
        ]]>
    </method>

</class>

</library>
