<?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="interviewWhiteboard" extends="view" clip="true">
	<attribute name="checkPodsDelegate" value="null"/>
	        
	<handler name="oninit">
	<![CDATA[
		canvas._drawarea = this;
		if (checkPodsDelegate == null && !_recStarted.visible) {
			checkPodsDelegate = new LzDelegate(this, "checkPods");
			lz.Timer.addTimer(checkPodsDelegate, 1000);
		}
		this.reloadStatus();
	]]>
	</handler>
    
    <handler name="ondestroy">
		stopPodChecks();
    </handler>
    
    <handler name="onopenWhiteBoard" >
        if ($debug) Debug.write("-- onOpenWhiteBoard --");
    </handler>
    
	<method name="newInterviewStarting" args="refObj">
	<![CDATA[
		this._videoviewcontent["interviewVideoBox"+refObj.interviewPodId].startInterView();
	]]>
	</method>
	
	<method name="stopPodChecks">
		if (checkPodsDelegate != null) {
			lz.Timer.removeTimer(checkPodsDelegate);
			checkPodsDelegate = null;
		}
	</method>

	<method name="onInterviewPodCount" args="count">
		_interview._start.setAttribute("enabled", count > 0);
	</method>
	
	<method name="checkPods" args="ignore=null">
		//if ($debug) Debug.write(":: Pods :: check :: ");
		canvas.sendViaLocalConnection(canvas.vid_lc_name, "getVideoObjectCount", [null]);
		lz.Timer.resetTimer(checkPodsDelegate, 1000);
	</method>
	
    <method name="reloadStatus">
        this.getInterviewRecordingStatus.doCall();
    </method>
    
    <!--
    getInterviewRecordingStatus()
     -->
    <netRemoteCallHib name="getInterviewRecordingStatus" funcname="getInterviewRecordingStatus" 
                      remotecontext="$once{ canvas.thishib }" >  
        <handler name="ondata" args="value">
            <![CDATA[
                if ($debug) Debug.write("getInterviewRecordingStatus: ",value);
                if (value) {
                    parent._recStarted.setAttribute("visibility","visible");
                } else {
                    parent._recStarted.setAttribute("visibility","hidden");
                }
            ]]>
        </handler>
    </netRemoteCallHib> 
    
    <simplelayout axis="y" spacing="2" />
    
    <commonVideoViewContent name="_videoviewcontent" x="40" >
        <simplelayout axis="x" spacing="2" />
        
        <interviewVideoBox name="interviewVideoBox1" interviewPodId="1" />
        <interviewVideoBox name="interviewVideoBox2" x="324" interviewPodId="2" />
    </commonVideoViewContent>
    
    <view name="_interview" align="center" visible="${ canvas.ismoderator }">
        <!--
           public synchronized Boolean startInterviewRecording()
         -->
        <netRemoteCallHib name="startInterviewRecording" funcname="startInterviewRecording" remotecontext="$once{ canvas.thishib }" >  
            <handler name="ondata" args="value">
                <![CDATA[
                    if ($debug) Debug.write("startInterviewRecording: ",value);
                    if (!value) {
                        new lz.labelerrorPopup(canvas,{errorlabelid:915});
                    }
                ]]>
            </handler>
        </netRemoteCallHib>          
        
        <netRemoteCallHib name="stopInterviewRecording" funcname="stopInterviewRecording" remotecontext="$once{ canvas.thishib }" >  
            <handler name="ondata" args="value">
                <![CDATA[
                    if ($debug) Debug.write("stopInterviewRecording: ",value);
                    if (!value) {
                        new lz.labelerrorPopup(canvas,{errorlabelid:916});
                    }
                ]]>
            </handler>
        </netRemoteCallHib>  
        
        <simplelayout axis="x" spacing="2" />
        
        <simpleLabelButton name="_start" labelid="913" height="30" width="200">
            <handler name="onclick">
                if ($debug) Debug.write("Start Recording");
                parent.startInterviewRecording.doCall();
            </handler>
            <view x="2" y="4" resource="interview_record_start" />
        </simpleLabelButton>
        
        <simpleLabelButton name="_stop" labelid="914" height="30" width="200">
            <handler name="onclick">
                if ($debug) Debug.write("Stop Recording");
                parent.stopInterviewRecording.doCall();
            </handler>
            <view x="2" y="4" resource="interview_record_stop" />
        </simpleLabelButton>
        
    </view>
    
    <view name="_recStarted" align="center" visibility="hidden">
        <labelText labelid="917" />
    </view>
        
</class>

</library>
