<?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.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="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);
			canvas.thishib.src = null;
			canvas.thishib.disconnect();
			canvas.thishib._nc.close();
		}
	]]>
	</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>
