<?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>
    
    
<!---
	View for recorded contents list.
	When you select 'Recordings' on the top menu, this class shows the list.
-->
<class name="lzRecordingsViewMain" extends="basePropertyPanelWhiteboard" labelid="858" allowToggle="false"
           x="${ parent._navigationArea.width + parent._navigationArea.x }"
           height="${ canvas.height - canvas.naviHeightDelta - parent._recordingsViewBottom.height }"
          width="${ canvas.width - parent._navigationArea.width - parent._navigationArea.x }">
        
        <attribute name="recordingName" value="" type="string"/>
        
        <!---
        isPaused is true if a video is running but paused
         -->
        <attribute name="isPaused" value="false" type="boolean"/>
        
        <!--- 
            Shows if there is currently a video running
         -->
        <attribute name="timerDelegateStarted" value="false" type="boolean"/>
        
        <attribute name="recordingLog" value="" type="string"/>
        
        <attribute name="deltaInSeconds" value="0" type="number"/>
        
        <!-- invoked after the connection in the audio/video container was closed -->
        <event name="onRecordingStoppedAndDisconnected" />
        
        <method name="connect">
        	this._content._videostream.connect();
        </method>
        
        <method name="showLog">
        	if ($debug) Debug.write("getFlvRecordingLog flvRecordingId ",this.getFlvRecordingLog.flvRecordingId);
        	this.getFlvRecordingLog.doCall();
        </method>
        
        <netRemoteCallHib name="getFlvRecordingLog" funcname="flvrecorderservice.getFlvRecordingLog" 
            remotecontext="$once{ canvas.thishib }" showLoading="false"> 
            <attribute name="flvRecordingId" value="0" type="number"/>  
            <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
            <netparam><method name="getValue">return parent.flvRecordingId;</method></netparam>
            <handler name="ondata" args="value">    
                <![CDATA[
                    var tLogString = "";
                    var headerMessage = "<br/>"+canvas.getLabelName(889);
                    for (var i = 0;i<value.length;i++) {
                        
                        tLogString += headerMessage 
                                    + parseDateToStringTimeSeconds(value[i].inserted)
                                    + '<br/>'
                                    + value[i].msgType
                                    + '<br/>'
                                    + value[i].fullMessage
                                    + '<br/>'
                                    + value[i].exitValue
                                    + '<br/>';
                        
                    }
                    
                    if ($debug) Debug.write("getFlvRecordingLog: ");
                    
                    new lz.messageRecordingWin(canvas,{error:tLogString,labelTitleId:903});
                ]]>
            </handler>
        </netRemoteCallHib> 
        
        <method name="restartConversion" args="left,right,leftTime,rightTime">
        	<![CDATA[
	            if ($debug) Debug.write("restartConversion ",this.getFlvRecordingLog.flvRecordingId);
	            
	            if (left == "" || right == "" || leftTime == "" || rightTime == "") {
	            	new lz.labelerrorPopup(canvas,{
			            		error:'You have to set at least 0 as value for Left, Right, Time'
			            	});
	            	return;
	            }
	            
	            this.restartInterviewConversion.left = Number(left);
	            this.restartInterviewConversion.right = Number(right);
	            
	            this.restartInterviewConversion.leftTime = Math.round(Number(leftTime));
	            this.restartInterviewConversion.rightTime = Math.round(Number(rightTime));
	            
	            if ($debug) Debug.write("this.restartInterviewConversion.left :: ",this.restartInterviewConversion.left);
	            if ($debug) Debug.write("this.restartInterviewConversion.right :: ",this.restartInterviewConversion.right);
	            
	            this.restartInterviewConversion.doCall();
            ]]>
        </method>
        
        <netRemoteCallHib name="restartInterviewConversion" funcname="flvrecorderservice.restartInterviewConversion" 
            remotecontext="$once{ canvas.thishib }" showLoading="false"> 
            <attribute name="flvRecordingId" value="0" type="number"/>
            <attribute name="left" value="0" type="number"/>  
            <attribute name="right" value="0" type="number"/>
            <attribute name="leftTime" value="0" type="number"/>
            <attribute name="rightTime" value="0" type="number"/>         
            <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
            <netparam><method name="getValue">return parent.flvRecordingId;</method></netparam>
            <netparam><method name="getValue">return parent.left;</method></netparam>
            <netparam><method name="getValue">return parent.right;</method></netparam>
            <netparam><method name="getValue">return parent.leftTime;</method></netparam>
            <netparam><method name="getValue">return parent.rightTime;</method></netparam>
            <handler name="ondata" args="value">    
                if ($debug) Debug.write("restartInterviewConversion: ",value);
                new lz.errorPopup(canvas,{error:"Re-Sampling Started, that can take some time, click on the Interview to get the status "});
            </handler>
        </netRemoteCallHib> 
        
        <method name="setNewStream" args="recording">
        	<![CDATA[
        	
        		this.stopStream();
        	    this.isPaused = false;
        	    
        	    var hasFailed = false;
        			
    			var tLogString = "";
    			var headerMessage = "<br/>"+canvas.getLabelName(889);
    			
    			this.recordingLog = "";
    			
    			this.recordingName = recording.fileHash;
    			
    			this.getFlvRecordingLog.flvRecordingId = recording.flvRecordingId;
    			this.restartInterviewConversion.flvRecordingId = recording.flvRecordingId;
    			
    			//Check if recording is not yet completed or if it has failed
    			// *** This is disabled for now as the Log can grow too big ***
    			for (var i = 0;i<recording.flvRecordingLog.length;i++) {
    				
    				if (recording.flvRecordingLog[i].exitValue != "0") {
    					
    					hasFailed = true;
    					tLogString += headerMessage 
    								+ parseDateToStringTimeSeconds(recording.flvRecordingLog[i].inserted)
    								+ '<br/>'
    								+ recording.flvRecordingLog[i].msgType
    								+ '<br/>'
    								+ recording.flvRecordingLog[i].fullMessage
    								+ '<br/>';
    					
    				}
    				
    				this.recordingLog += headerMessage 
    								+ parseDateToStringTimeSeconds(recording.flvRecordingLog[i].inserted)
    								+ '<br/>'
    								+ recording.flvRecordingLog[i].msgType
    								+ '<br/>'
    								+ recording.flvRecordingLog[i].fullMessage
    								+ '<br/>';
    				
    			}
    			
    			if (hasFailed) {
    				
    				if ($debug) Debug.write("tLogString "+tLogString);
					//var tString = canvas.getLabelName(887) + tLogString;
					
					new lz.messageRecordingWin(canvas,{error:tLogString,labelTitleId:887});
					
				} 
				
				if (recording.previewImage != null && recording.previewImage != "") {
					
	            	this.recordingName = recording.fileHash;
	            	
	            	this._content.initW = recording.flvWidth;
	            	this._content.initH = recording.flvHeight;
	            	
	            	var downloadurl = canvas.protocol + '://'+canvas.rtmphostlocal+':'+canvas.red5httpport
	                            +canvas.httpRootKey+'DownloadHandler?fileName='+recording.previewImage
	                            +'&moduleName=lzRecorderApp&parentPath=&room_id='
	                            +'&sid='+canvas.sessionId;
	                
	                if($debug) Debug.write("lzRecorder/downloadurl "+downloadurl);
	            	
	            	this._content._preview.imagePreview.setAttribute("src",downloadurl)
	            	
	            	this._content._preview.bringToFront();
	            	
	            	this._content.setItemContraints(0);
	            	
	            	this.deltaInSeconds = Math.round((recording.recordEnd.getTime() - recording.recordStart.getTime())/1000);
	                
	                if ($debug) Debug.write("deltaInSeconds ",this.deltaInSeconds);
	                
	                var minutes = Math.floor(this.deltaInSeconds/60);
	                
	                if ($debug) Debug.write("minutes ",minutes);
	                
	                var restSeconds = this.deltaInSeconds - ( minutes * 60 );
	                
	                this._progress._progressbar._duration.setAttribute("text",minutes+" min "+restSeconds+" sec");
                
        		} else {
        			
        			var error = canvas.getLabelName(888);
        			
        			if (recording.isInterview) {
        				error += "<br/>" + canvas.getLabelName(919) + " " + recording.progressPostProcessing + "%";
        			}
        			
    				new lz.labelerrorPopup(canvas,{error:error});
        			
        		}
            	
        	]]>
        </method>
        
        <method name="calcProgressBar">
        	<![CDATA[
        	
        	   var flvTime = this._content._videostream.getTime();
        	   
        	   if ($debug) Debug.write("flvTime :calcProgressBar: ",flvTime);
        	   parent._recordingsViewBottom.showProgress(flvTime);
        	   
        	   this._progress._progressbar._pointer.setAttribute("visibility","visible");
        	   
        	   var tString = "";
        	   
        	   if (flvTime > 60) {
        	   	
        	   	   var minutes = Math.floor(flvTime/60);
        	   	   
        	   	   var restSeconds = Math.round(flvTime) - ( minutes * 60 );
        	   	   
        	   	   tString = minutes + " min " + restSeconds + " sec";
        	   	
        	   } else {
        	   	
        	   	   tString = Math.round(flvTime) + " sec";
        	   
        	   }
        	   
        	   this._progress._progressbar._time.setAttribute("text",tString);
        	   
        	   var tNewX = Math.round((this._progress._progressbar.width / this.deltaInSeconds) * flvTime);
        	
        	   this._progress._progressbar._pointer.setAttribute("x",tNewX);
        	   
        	]]>
        </method>
        
        <method name="startStream">
        	
        	if ($debug) Debug.write("startStream ",this.recordingName);
        	
        	if (this.recordingName != "") {
        		
        		this.isPaused = false;
        		
        		if (!this.timerDelegateStarted) {
        			this.timerDelegateStarted = true;
                }
                
            	this._content._videostream.bringToFront();
                this._content._videostream.playStream(this.recordingName,0);
        	}
        </method>
        
        <method name="toggleStream">
        	if (this.timerDelegateStarted) {
        		this.pauseStream();
        	} else {
        		this.startStream();
        	}
        </method>
        
        <method name="pauseStream">
        	this.isPaused = !this.isPaused;
        	this._content._videostream.pause(this.isPaused);
        </method>
        
        <method name="seekStream" args="newX">
            <![CDATA[
        	
                if ($debug) Debug.write("seekStream ",newX);
        	
                if (this.timerDelegateStarted) {
        	   	
                    var flvTime = Math.round( newX / (this._progress._progressbar.width / this.deltaInSeconds) );
                    
                    if ($debug) Debug.write("seekStream :: this.deltaInSeconds ",this.deltaInSeconds);
                    
                    if ($debug) Debug.write("seekStream :: flvTime ",flvTime);
                    
                    this._content._videostream.seek(flvTime);
        	   	
                }
        	
            ]]>
        </method>
        
        <method name="stopStreamAndCloseRecorder">
        	this._stopStream();
            this._content._videostream.stopAndCloseConnection();
        </method>
        
        <method name="stopStream">
            this._stopStream();
            this._content._videostream.stop();
        </method>
        
        <!---
            @keywords private
         -->
        <method name="_stopStream">
        	if (this.timerDelegateStarted) {
                this.timerDelegateStarted = false;
            }
        	parent._recordingsViewBottom.stopProgress();
            this._progress._progressbar._time.setAttribute("text","");
            this._progress._progressbar._pointer.setAttribute("x",0);
        </method>
        
        <view name="_content" height="${ parent.height-22-18 }" y="22">
        	
    	    <attribute name="initH" value="480" type="number" />
            <attribute name="initW" value="640" type="number" />
    
    	    <handler name="oninit">
                <![CDATA[
                    var prop2 = [this, "height"];
                    this.applyConstraintMethod("setItemContraints", prop2);
                    this.setItemContraints(0);
                ]]>
            </handler>
            
            <method name="setItemContraints" args="w">
                <![CDATA[
                    var w = this.height * this.initW/this.initH;
                    this.setAttribute("width",w);
                ]]>
            </method>
            
            <view name="_preview" width="${parent.width}" height="${parent.height}" bgcolor="0x000000">
            	<image name="imagePreview" stretches="both"
            		   width="${parent.width}" height="${parent.height}" />
                <handler name="onclick">
                	if ($debug) Debug.write("onclick -- toggleStream");
                    parent.parent.toggleStream();
                </handler>		   
                <view width="60" height="40" valign="middle" opacity="0.7"
                	  align="center" bgcolor="0xFFFFFF">
                	<view resource="lz_recorder_play" valign="middle" align="center" />
                </view>
            </view>
            
            <lzRecordingsViewAdapter name="_videostream" width="${parent.width}" height="${parent.height}">
            	
            	<handler name="onwidth" args="w">
            		this.updateRecordingVideoPosition();
            	</handler>
            	
            	<handler name="onheight" args="h">
            		this.updateRecordingVideoPosition();
            	</handler>
            	
            	<handler name="onUpdateRecordingStreamTime">
            		if ($debug) Debug.write("onUpdateRecordingStreamTime ");
            		parent.parent.calcProgressBar();
            	</handler>
            	
            	<handler name="onTogglePlayRecordingStream">
            		if ($debug) Debug.write("onTogglePlayRecordingStream ");
            		parent.parent.toggleStream();
            	</handler>
            	
            	<handler name="onRecordingStoppedAndDisconnected">
            		if ($debug) Debug.write("onRecordingStoppedAndDisconnected ");
            		parent.parent.onRecordingStoppedAndDisconnected.sendEvent();
            	</handler>
            	
            </lzRecordingsViewAdapter>
            
        </view>
        
        <view name="_progress" height="18" valign="bottom" width="${ parent.width }"
        	                   bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }">
        	
        	<view resource="flv_recorder_play_small_rsc" y="1" height="16" width="16"
        		      bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
        		<handler name="onmouseover">
                    this.setAttribute("bgcolor",0xFFFFFF);
                </handler>
                <handler name="onmouseout">
                    this.setAttribute("bgcolor",canvas.getThemeColor('baseMouseOvercolorizer'));
                </handler>
        		<handler name="onclick">
        			parent.parent.startStream();
        		</handler>
        		<labelTooltip labelid="875" />
        	</view>
        	
        	<view name="_progressbar" x="16" width="${ parent.width - 32 }" y="1" 
        		  height="16" bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
        		
        		<view x="0" width="${ parent.width }" y="0" height="16" bgcolor="0xFFFFFF" opacity="0.5" /> 
        		
        		<handler name="onclick">
        			parent.parent.seekStream(this.getMouse("x"));
        		</handler>
        		
        		<view name="_pointer" resource="flv_progress_pointer_rsc" visibility="hidden" />
        		
        		<text name="_time" resize="true" fontsize="10" />
        		
        		<text name="_duration" align="right" resize="true" fontsize="10" />
        		
        	</view>
        	
        	<view resource="flv_recorder_stop_small_rsc" align="right" y="1" height="16" width="16"
        		  bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
        		<handler name="onmouseover">
        			this.setAttribute("bgcolor",0xFFFFFF);
        		</handler>
        		<handler name="onmouseout">
                    this.setAttribute("bgcolor",canvas.getThemeColor('baseMouseOvercolorizer'));
                </handler>
                <handler name="onclick">
                    parent.parent.stopStream();
                </handler>
                <labelTooltip labelid="876" />
            </view>
        	
        </view>
        
</class>



</library>
