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

	<attribute name="user_id" value="0" type="number" />
	<attribute name="username" value="" type="string" />
	<attribute name="usertime" value="" type="string" />
	<attribute name="cbtext" value="" type="string" />
	
	<handler name="oninit">
		<![CDATA[
	        var downloadurl = canvas.protocol+'://'+canvas.rtmphostlocal+':'+canvas.red5httpport
	        		+canvas.httpRootKey+'DownloadHandler?fileName=CHAT'
	        		+'&moduleName=chat&parentPath=&room_id='
	        		+'&remoteUserid='+this.user_id
	        		+'&sid='+canvas.sessionId;
	        		
	        if ($debug) Debug.write("downloadurl "+downloadurl);
	        this._userpic.setAttribute('src',downloadurl);	
	        
	        if ($debug) Debug.write("TIME: "+this.usertime);
	        
        ]]>
	</handler>
	
	<image name="_userpic" />

	<text text="$once{ parent.username }" x="40"
		  width="$once{ parent.width - 40 }"
		  selectable="true" />
	
	<text text="$once{ parent.usertime }" x="40" y="20" />

</class>

<class name="roomListDetails" extends="view" >

	<attribute name="roomid" value="0" type="number" />
	<attribute name="roomname" value="" type="string" />
	<attribute name="roomcomment" value="" type="string" />
	<attribute name="currentusers" value="null" />
	
	
	<method name="doinit" args="currentusers,roomid,roomname,roomcomment">
		<![CDATA[
			if ($debug) Debug.write("doinit",currentusers,roomid,roomname);
			this.setAttribute('currentusers',currentusers);
			this.setAttribute('roomid',roomid);
			this.setAttribute('roomname',roomname);
			this.setAttribute('roomcomment',roomcomment);
			this._roomname.setAttribute('text',canvas.getLabelName(406)+" "+roomname);
			this._roomcomment.setAttribute('text', roomcomment);
			this._users.clearList();
			if (this.currentusers != null) {
				for (var i = 0;i<this.currentusers.length;i++){
					var username = this.currentusers[i].firstname + " "
							+ this.currentusers[i].lastname
							+ " (" + this.currentusers[i].username + ") ";
					 new lz.userRoomTabItem(this._users._users._cbtext,{user_id:this.currentusers[i].user_id,username:username,usertime:canvas.getLabelName(408)+parseDateToStringTime(this.currentusers[i].roomEnter)});
				}
			}
			this.bdatum.setAttribute("visibility", "hidden");
    		this.edatum.setAttribute("visibility", "hidden");
    		this.l_bdatum.setAttribute("visibility", "hidden");
    		this.l_edatum.setAttribute("visibility", "hidden");
    		if (roomid > 0) {
				this.getAppointmentData.doCall();
			}
		]]>
	</method>
	
	<!-- Retrieving Appointmentdata for Meeting -->
	<netRemoteCallHib name="getAppointmentData" remotecontext="$once{ canvas.thishib }" 
		funcname="conferenceservice.getAppointMentDataForRoom" >   
		<netparam><method name="getValue">return parent.parent.roomid;</method></netparam>
		<handler name="ondata" args="value">	
		    <![CDATA[
		    	if ($debug) Debug.write("getAppointmentData: ",value);
		    	
		    	if(value!=null){
		    		
		    		if ($debug) Debug.write("Appointment Name : " + value.appointmentName);
		    		parent.bdatum.setAttribute('text',""+value.appointmentStarttime);
		    		parent.edatum.setAttribute('text',""+value.appointmentEndtime);
		    		
		    		
		    		parent.bdatum.setAttribute("visibility","visible");
		    		parent.edatum.setAttribute("visibility","visible");
		    		parent.l_bdatum.setAttribute("visibility","visible");
		    		parent.l_edatum.setAttribute("visibility","visible");
		    		
		    		if ($debug) Debug.write("Appointment Start : " + value.appointmentStarttime);
		    		if ($debug) Debug.write("Appointment End : " + value.appointmentEndtime);
		    		
		    	} else{
		    		
		    		parent.bdatum.setAttribute('text','');
		    		parent.edatum.setAttribute('text','');
		    		
		    		parent.bdatum.setAttribute("visibility", "hidden");
		    		parent.edatum.setAttribute("visibility", "hidden");
		    		parent.l_bdatum.setAttribute("visibility", "hidden");
		    		parent.l_edatum.setAttribute("visibility", "hidden");
		    		
		    	}
		    ]]>	        	          				
		</handler>	
	</netRemoteCallHib> 	
	
	<netRemoteCallHib name="getRoomClientsMapByRoomId" funcname="conferenceservice.getRoomClientsMapByRoomId" 
		remotecontext="$once{ canvas.thishib }" >   
		<netparam><method name="getValue">return parent.parent.roomid;</method></netparam>
		<handler name="ondata" args="value">	
		    <![CDATA[
		    	if ($debug) Debug.write("getRoomClientsListByRoomId: ",value);
		    	parent.currentusers = value;
		    	parent.doinit();
		    ]]>	        	          				
		</handler>	
	</netRemoteCallHib>   	
	
	<labelText labelid="404" fontstyle="italic" width="200" />
	
	<labelText name="_roomname" labelid="406" y="20" width="200" />
	
	<labelText name="l_bdatum" labelid="570" y="40" width="50" visible="false" />
	<labelText name="bdatum" y="40" x="75" width="100" text="" visible="false" /> 	            	

	<labelText name="l_edatum" labelid="571" y="60" width="50" visible="false" />
	<labelText name="edatum" y="60" x="75" width="100" text="" visible="false" />

	<labelText name="_roomcomment" x="75" y="${parent.l_edatum.y + (parent.l_edatum.visible ? 30 : 0)}" width="100" text=""/>
	<labelText labelid="270" y="${parent._roomcomment.y}" width="50" />

	<labelText name="user_label" labelid="407" y="${10 + parent._roomcomment.y + parent._roomcomment.height}" width="200" />
	<view name="_users" width="300" y="${30 + parent._roomcomment.y + parent._roomcomment.height}"
				height="${ parent.height - parent._users.y }" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }">
		<method name="clearList">
			for (var eg in this._users._cbtext.subviews) 
				this._users._cbtext.subviews[eg].destroy();
		</method>
		<view name="_users" width="299" height="${ parent.height - 1 }" bgcolor="0xFFFFFF" 
			  x="1" y="1" clip="true" >
			<view name="_cbtext" width="286" layout="axis:y;spacing:2" />
			<om_vscrollbar />
		</view>
	</view>
	
</class>

</library>
