<?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.getUrl() + '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.title);
		    		parent.bdatum.setAttribute('text',""+value.start);
		    		parent.edatum.setAttribute('text',""+value.end);
		    		
		    		
		    		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.start);
		    		if ($debug) Debug.write("Appointment End : " + value.end);
		    		
		    	} 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="getRoomClientsListByRoomId" funcname="conferenceservice.getRoomClientsListByRoomId" 
		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>
