<?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="interviewVideoChooseUser" extends="guiPresenter" resizeable="false"
    width="220" height="100" closable="true" labelid="910" y="10" minimizable="false">
    
    <attribute name="refObj" value="null" />
    
    <handler name="oninit">
        this.getClientListScope.doCall();
    </handler>
    
    <netRemoteCallHib name="getClientListScope" funcname="getClientListScope" remotecontext="$once{ canvas.thishib }" >   
        <handler name="ondata" args="value">
		<![CDATA[
			if ($debug) Debug.write("+++++++++++++++++ getClientListScope : ",value);
			for (var i = 0; i < value.length; ++i) {
				var name = (value[i].firstname == null ? "" : value[i].firstname) + ',' + (value[i].lastname == null ? "" : value[i].lastname);
				parent._users.addItem(name + ' [' + value[i].username + ']', value[i].publicSID);
			}
			parent._users.selectItemAt(0);
		]]>
		</handler>  
    </netRemoteCallHib>
    
    <labelText labelid="911" x="2" y="22"/>
    
    <resetCombobox name="_users" x="2" y="42" width="$once{ parent.width-4 }"/>
    
    <simpleLabelButton labelid="61" width="100" x="$once{ parent.width - 105 }" y="$once{ parent.height - 26 }">
        <handler name="onclick">
            this.parent.close();
        </handler>
    </simpleLabelButton>    
    
    <simpleLabelButton labelid="60" width="100" x="$once{ parent.width - 210 }" y="$once{ parent.height - 26 }">
        <handler name="onclick">
            var valueCombobox = parent._users.getValue();
            if (this.parent.refObj.sendConfirmation(valueCombobox)) {
                this.parent.close();
            }
        </handler>
    </simpleLabelButton>   
    
</class>
 
<class name="interviewVideoBox" extends="view" width="322" height="281" bgcolor="0x000000">
    <attribute name="interviewPodId" value="0" type="number" />
    
    <method name="startInterView">
        if ($debug) Debug.write("startInterView :: ");
        var tx = this.getAttributeRelative("x",canvas);
        var ty = this.getAttributeRelative("y",canvas);
        canvas._videocontainer._videoviewcontent.showDevicePopUpInterview(false,this.interviewPodId,tx,ty,this.width,this.height);
    </method>

	<method name="sendConfirmation" args="publicSID">
		if ($debug) Debug.write("sendConfirmation :: ",publicSID);
		
		canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = publicSID;
		canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = true;
		canvas.thishib.setBroadCastingFlag.canVideo = !canvas.currentRoomObj.isAudioOnly;
		canvas.thishib.setBroadCastingFlag.interviewPodId = this.interviewPodId;
		canvas.thishib.setBroadCastingFlag.doCall();
		
		return true;
	</method>
    
    <netRemoteCallHib name="sendMessageWithClientByPublicSID" funcname="sendMessageWithClientByPublicSID" 
                      remotecontext="$once{ canvas.thishib }" >  
        <attribute name="messageObject" value="null" />
        <attribute name="publicSID" value="" type="string" />
        <netparam><method name="getValue">return parent.messageObject;</method></netparam>
        <netparam><method name="getValue">return parent.publicSID;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                if ($debug) Debug.write("+sendMessageWithClientByPublicSID : ",value);
                
            ]]>
        </handler>  
    </netRemoteCallHib>
    
    <simpleLabelButton labelid="910" height="30" valign="middle" align="center"
               visible="${ ((canvas.ismoderator) ? true : ((canvas.isAllowedToDraw) ? true : false )) }">
        <handler name="onclick" args="refObj">
            new lz.interviewVideoChooseUser(canvas,{
                           isInterview:true,
                           x:this.getAttributeRelative("x",canvas)-10,
                           y:this.getAttributeRelative("y",canvas)-20,
                           width:this.width+20,
                           refObj:parent
                        });
        </handler>
    </simpleLabelButton>
</class>


</library>
