<?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="restrictedUserList" extends="view" width="$once{ parent.width }" 
       height="${ parent.height-34 }">

    <!--- holds a references to the videoview which is broadcasting -->
    <attribute name="broadCastViewRef" value="null" />
    
    <!--- colors for each user -->
    <attribute name="colorArray" value="null" />
    
    <attribute name="allowUserQuestions" value="true" type="boolean" />

	<attribute name="showsVideoInSeparateComponent" value="true" type="boolean" />
	<attribute name="timeout" value="500" type="number"/>
	<attribute name="batchSize" value="10" type="number"/>
	<attribute name="counter" value="0" type="number"/>
	<attribute name="batchCreateVideoDelegate" type="object" value="null"/>
	<attribute name="initClients" type="object" />
    
    <handler name="onallowUserQuestions" args="bool">
        if (bool != null) {
            if (!bool) {
                this._participants._applyAndStatusIcons.destroy();
            }
        }
    </handler>
    
    <handler name="oninit">
        //set modus
        canvas.thishib.modus = "audience";
        
        //set reference, this reference will be cleared at *ontabcontenctleave* event
        canvas._videocontainer=this;
        
        // Reconnect User to its Room Id
        canvas.thishib.userScope = canvas.thishib.currentroomid;
        var src = hib.getUrl();
        
        if( $debug ) Debug.write("videoContainer: canvas.thishib: ",canvas.thishib.src,canvas.thishib);
        
        if (canvas.thishib.src != src) {
            canvas.thishib.setAttribute('src',src);
            
			if (canvas.wicketsid == null){            
	            canvas.thishib.reconnectionAction = true;
	            canvas.thishib.reconnectObjRef = this;
	            canvas.thishib.disconnect();
            } else {
            	this.reconnectSuccess();
            }
        } else {
            //The user is already in the correct Scope
            this.reconnectSuccess();
        }
    </handler>

    <commonVideoComponentAdapter name="_videoviewcontent"/>

    <method name="reconnectSuccess">
        if ($debug) Debug.write("User Reloged In");
        //Send to SWF10 video-container to connect on the conference room url
        //and wait for the as3ConnectionSuccess-Event
        this._videoviewcontent.reconnectSuccess(false);
    </method>

    <!---
        We need to wait till the video-container / as3 app has the connection established
        otherwise it can happen that the video tries to start playing before the rtmp-connection
        was established
     -->
    <method name="as3ConnectionSuccess">
    	if ($debug) Debug.write("as3ConnectionSuccess continue loading");
    	//set default values and get already availible streams
    	//it can happen that if you click to exit the room the views are not
    	//not cleaned up yet and you receive this event from the LocalConnection
    	if (this["getRoomModeratorsByRoomId"]) {
            this.getRoomModeratorsByRoomId.doCall();
    	}
    </method>

    <netRemoteCallHib name="getRoomModeratorsByRoomId" funcname="conferenceservice.getRoomModeratorsByRoomId"
                      remotecontext="$once{ canvas.thishib }" >  
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>    
        <netparam><method name="getValue">return hib.currentroomid;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                if ($debug) Debug.write("getRoomModeratorsByRoomId: ",value);
                canvas.becomeSuperModerator = false;
                
                parent.setRoomValues.applyDefaultModeration = canvas.becomemoderator;
                canvas.becomeSuperModerator = canvas.becomemoderator;
                
                if (!canvas.becomeSuperModerator) {
                    for (var i=0;i<value.length;i++) {
                        
                        if (value[i].user.user_id == canvas.user_id) {
                            parent.setRoomValues.applyDefaultModeration = true;
                            canvas.becomeSuperModerator = value[i].isSuperModerator;
                            if ($debug) Debug.info("Make this User to an Moderator");
                            break;
                        }
                        
                    }
                }
                
                if ($debug) Debug.write("canvas.becomemoderator: ",canvas.becomemoderator);
                if ($debug) Debug.write("canvas.becomeSuperModerator: ",canvas.becomeSuperModerator);
                
                canvas.currentusercolor = canvas.getColorForUser();
                
                var organisation_id = 1;
            
                if ($debug) Debug.write(hib.userobject); 
                if ($debug) Debug.write(hib.currentdomainObj); 
                
                if (hib.currentdomainObj != null) {
                    organisation_id = hib.currentdomainObj.organisation_id
                }
                
                this.parent.setRoomValues.organisation_id = organisation_id;
                this.parent.setRoomValues.doCall();
            
            ]]>
        </handler>
    </netRemoteCallHib>     

    <netRemoteCallHib name="setRoomValues" funcname="setRoomValues" remotecontext="$once{ canvas.thishib }" >   
        <attribute name="applyDefaultModeration" value="false" type="boolean" />
        <attribute name="organisation_id" value="0" type="number" />
        <netparam><method name="getValue">return hib.currentroomid;</method></netparam>
        <netparam><method name="getValue">return parent.applyDefaultModeration;</method></netparam>
        <netparam><method name="getValue">return canvas.becomeSuperModerator;</method></netparam>
        <netparam><method name="getValue">return parent.organisation_id;</method></netparam>
        <netparam><method name="getValue">return canvas.currentusercolor;</method></netparam>
        <handler name="ondata" args="roomStatus">
            <![CDATA[
            //The onResult-Handler will be called be the rtmpconnection
            //if ($debug) Debug.write("setRoomValues1: ",value);
            //if ($debug) Debug.write("setRoomValues2: ",hib.currentroomid);
            
            //if ($debug) Debug.write("+++++++++++++++++ getClientListScope : ",value);
            
            if (roomStatus.roomFull) {
                canvas.thishib.showFullMessage = true;
                canvas.thishib.disconnect();
            }
            
            if (roomStatus.browserStatus.browserInited) {
                var tObj = new Object();
                tObj[0] = "newBrowserURL";
                tObj[1] = roomStatus.browserStatus.currentURL;
                canvas.startBrowser(tObj);
            }
            
            var value = roomStatus.clientList;
            
            for (var i = 0; i < value.length; ++i){
                if ( value[i].streamid == canvas.streamid ) {
                    value[i].selfItem = true;
                    canvas.isAllowedToDraw = value[i].canDraw;
                } else {
                    value[i].selfItem = false;
                }
				parent.addItemInitial(value[i]);
			}
			parent.batchCreateVideoDelegate = new LzDelegate(parent, "batchCreateVideo");
			parent.counter = 0;
			parent.initClients = value;
			lz.Timer.addTimer(parent.batchCreateVideoDelegate, 0);
            
            //Render and Show User-List
            parent._participants.sortAndRenderList();
            
            if (canvas._currentChatPanel.visible) {
				canvas._currentChatPanel.toggleopen();
			}
		]]>
        </handler>  
    </netRemoteCallHib>

	<method name="batchCreateVideo" args="none">
	<![CDATA[
		if ($debug) Debug.write("interval 0 :: ", counter, initClients.length);
		if (!batchCreateVideoDelegate) {
			return;
		}
		var cl = new Array();
		for (var i = 0; i < batchSize; ++i) {
			cl[i] = initClients[counter++];
			if (counter == initClients.length) {
				break;
			}
		}
		if ($debug) Debug.write("interval:: ", counter, cl.length);
		this._videoviewcontent.batchCreateVideo(canvas.streamid, cl);
		if (counter == initClients.length) {
			lz.Timer.removeTimer(batchCreateVideoDelegate);
			batchCreateVideoDelegate = null;
			
			//this content must be inited _after_ setting the default values
			canvas.thishib.getCurrentModeratorList.doCall();
			//FIXME Issue-1076
			canvas.thishib.checkLzRecording.doCall();
		} else {
			lz.Timer.resetTimer(batchCreateVideoDelegate, timeout);
		}
	]]>
	</method>

    <!-- invoked if another client logs into the room 
    after choosing devices -->     
    <method name="setAVSettingsToClient" args="rcl">
        this._videoviewcontent.setAVSettingsToClient(rcl);
    </method> 

	<method name="addItemInitial" args="object">
	<![CDATA[
		//if ($debug) Debug.write("initializeStreams addItem: ", object);
		this._participants.initialAddItem(object);
	]]>
	</method>

    <method name="receiveExclusiveAudioFlag" args="publicSID">
    <![CDATA[
        var vList = this._participants._table.renderList;
        for (var i=0;i<vList.length;i++) {
            var item = vList[i];
            var rcl = new Object();

            rcl.publicSID = item.publicSID;
            rcl.micMuted = !(publicSID == item.publicSID);
            canvas.setMuteStatus(rcl);
        }
    ]]>
    </method>


	<method name="addItem" args="connectedSince,isMod,streamid,username,userroom,formatedDate,position,color,object">
	<![CDATA[
		if ($debug) Debug.write("initializeStreams addItem: ",connectedSince,isMod,streamid,username,formatedDate);
		
		//Do init only in case this stream is NOT the same as we are
		if (streamid != canvas.streamid) {
			this._videoviewcontent.createVideo(object.publicSID, object.firstname+' '+object.lastname, object.broadCastID, object.avsettings, -1, object);
		}
		this._participants.addItem(object);
	]]>
	</method>
    
    <method name="addClientItem" args="connectedSince,isMod,streamid,username,room_id,formatedDate,position,color,object">
        <![CDATA[
        if ($debug) Debug.write("### initializeStreams addClientItem: ",connectedSince,isMod,streamid,username,room_id,formatedDate);

        if (canvas.publicSID != object.publicSID){
            this._videoviewcontent.createVideoObject(object.publicSID, false, -1, object);
        }

        //Do Add it anyway
        this._participants.addItem(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">
        this._videoviewcontent.startStream(publicSID,broadcastId,firstname,lastname,interviewPodId,VWidth,VHeight);
    </method>

    <method name="setSpeakingByPos" args="publicSID,bool">
        this._videoviewcontent.setSpeakingByPos(publicSID, bool);
    </method>

    <method name="closeStreamClient" args="publicSID">
        this._videoviewcontent.closeStreamClient(publicSID);
    </method>

    <method name="resetAllValues">
        this._videoviewcontent.resetAllValues();
    </method>
    
    <method name="removeVideoByUser" args="userObject">
        this._videoviewcontent.removeVideoByUser(userObject.publicSID);
    </method>
    
    <!--- 
        stops the streaming but and destroys the view
        @param int broadcastId broadcastId
     -->
    <method name="disconnectclient" args="publicSID">
        this._videoviewcontent.disconnectclient(publicSID);
        this._participants.disconnectclient(publicSID);
    </method>

    <method name="updateMuteStatusVideoView" args="roomClient">
        this._videoviewcontent.updateMuteStatusVideoView(roomClient);
    </method>
    
    <restrictedUserListInner name="_participants" />
    
</class>

</library>
