<?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="flvMetaInfoContentArea" extends="view" 
       width="${ parent.width }" height="168" clip="true">
	
	<attribute name="baseWidthForPointer" value="0" type="number"/>
	
	<method name="showProgress" args="flvTime,deltaInSeconds">
		<![CDATA[
		
            var tNewX = Math.round((this.baseWidthForPointer / deltaInSeconds) * flvTime);
		
            this.contentDevider._pointer.setAttribute("visibility","visible");
            this.contentDevider._pointer.setAttribute("x",tNewX);
            
		]]>
	</method>
	
	<method name="stopProgress">
		this.contentDevider._pointer.setAttribute("x",0);
	</method>
    
    <view name="content" width="${ parent.width }" height="168">
        
        <view name="content" layout="axis:y;spacing:2" />
        
        <om_vscrollbar />
        <om_hscrollbar />
        
    </view>
    
    <view name="contentDevider" x="${ parent.content.content.x }"
          width="${ parent.width }" height="168" >
    	
    	<view name="_pointer" resource="flv_progress_pointer_big_rsc" visibility="hidden" />
    	
    </view>
    
</class>


<class name="userActivityItem" extends="view">
    
    <attribute name="userText" value="" type="string" />
    
    <handler name="onmouseover">
    	this.setAttribute("opacity",0.5);
    </handler>
    
    <handler name="onmouseout">
        this.setAttribute("opacity",1);
    </handler>
    
    <view name="_middleIcon" width="$once{ parent.width - 20 }" 
          y="4" x="10" height="8" bgcolor="0x00CC00" />
          
    <view name="_startIcon" resource="icon_flv_recording_video_start_rsc" />
    
    <view name="_endIcon" align="right"
          resource="icon_flv_recording_video_start_rsc" />
    
    <labelText x="14" text="$once{ parent.userText }" y="-2" />
    
    <labelTooltip labelid="877" />
    
</class>


<class name="userActivityDevider" extends="view" >
    
    <attribute name="deviderText" value="" type="string"/>
    
    <view height="154" bgcolor="0x000000" width="1" />
    
    <labelText text="$once{ parent.deviderText }" y="134" />
    
</class>    
    
<!---
	View for recorded contents list.
	When you select 'Recordings' on the top menu, this class shows the list.
-->
<class name="lzRecordingsViewBottom" extends="basePropertyPanel" labelid="859" height="190" 
                   y="${ canvas.height - canvas.naviHeightDelta - this.height }" 
                   x="${ parent._navigationArea.width + parent._navigationArea.x }"
                   width="${ canvas.width - parent._navigationArea.width - parent._navigationArea.x }">
        
        <attribute name="pixelFactor" value="5" type="number"/>
        
        <attribute name="deltaInSeconds" value="0" type="number"/>
        
        <attribute name="currentRecording" value="null"/>
        
        <method name="showProgress" args="flvTime">
        	this.content._content.showProgress(flvTime,this.deltaInSeconds);
        </method>
        
        <method name="stopProgress">
            this.content._content.stopProgress();
        </method>
        
        <method name="showMetaData" args="rec">
            <![CDATA[
            
                this.currentRecording = rec;
            
                if ($debug) Debug.write("showMetaData ");
                
                this.content.clearContent();
                
                parent._recordingsViewMain.setNewStream(rec);
            
                this.deltaInSeconds = Math.round((rec.recordEnd.getTime() - rec.recordStart.getTime())/1000);
                
                if ($debug) Debug.write("deltaInSeconds ",deltaInSeconds);
                
                this.pixelFactor = deltaInSeconds/(this.width-16);
                
                if ($debug) Debug.write("pixelFactor ",this.pixelFactor);
                
                var widthItem = Math.round(deltaInSeconds/this.pixelFactor);
                
                if ($debug) Debug.write("widthItem ",widthItem);
                
                for (var i=0;i<rec.flvRecordingMetaData.length;i++) {
                    
                    if ($debug) Debug.write("isScreenData :: ",rec.flvRecordingMetaData[i].isScreenData);
                    
                    if (!rec.flvRecordingMetaData[i].isScreenData && 
                           ( rec.flvRecordingMetaData[i].isAudioOnly ||
                              ( !rec.flvRecordingMetaData[i].isAudioOnly && !rec.flvRecordingMetaData[i].isVideoOnly )
                           )
                        ) {
	                    var startTimeInSeconds = Math.round((rec.flvRecordingMetaData[i].recordStart.getTime() - rec.recordStart.getTime())/1000);
	                    var deltaInSecondsNew = Math.round((rec.flvRecordingMetaData[i].recordEnd.getTime() - rec.flvRecordingMetaData[i].recordStart.getTime())/1000);
	                    
	                    var widthItem = Math.round(deltaInSecondsNew/this.pixelFactor);
	                    var xItem = Math.round(startTimeInSeconds/this.pixelFactor);
	                    if ($debug) Debug.write("widthItem ",i,widthItem,xItem);
	                    
		                new lz.userActivityItem(this.content._content.content.content,{
	                                                  x:xItem,width:widthItem,
		                                              userText:rec.flvRecordingMetaData[i].freeTextUserName
		                                        });
                    }    
                    
                }
                
                if ($debug) Debug.write("deltaInSeconds :: ",deltaInSeconds,(deltaInSeconds/60));
                
                var minutes = Math.floor(deltaInSeconds/60);
                
                if ($debug) Debug.write("minutes ",minutes);
                
                if (minutes < 60) {
                    
                    for (var i=0;i<=minutes;i++) {
                        
                        var xItem = Math.round((i*60)/this.pixelFactor);
                        
                        //if ($debug) Debug.write("devisior ",i,xItem);
                        
                        new lz.userActivityDevider(this.content._content.contentDevider,{
						                          x:xItem,
                                                  deviderText:i+" min"
						                        });
                        
                    }
                    
                } else {
                    
                    var items = Math.floor(minutes/10);
                    
                    for (var i=0;i<=items;i++) {
                        
                        var xItem = Math.round(((i*10)*60)/this.pixelFactor);
                        
                        new lz.userActivityDevider(this.content._content.contentDevider,{
                                                  x:xItem,
                                                  deviderText:i+" min"
                                                });
                        
                    }
                    
                }
                
                this.content._content.baseWidthForPointer = this.content._content.width;
                
            ]]>
        </method>
        
        <view name="content" visibility="visible" y="22" bgcolor="0xFFFFFF"
              width="${ parent.width }" height="168">
            
            <method name="clearContent">
                this._content.destroy();
                new lz.flvMetaInfoContentArea(this,{name:'_content'});
            </method>
            
            <flvMetaInfoContentArea name="_content" />
            
        </view>
        
</class>



</library>
