<?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="roomListInviteUserItem" extends="view" bgcolor="$once{ canvas.bgColorMenuItems }" 
		   height="50" onmouseover="" onmouseout="" width="478" >

		<attribute name="ispublic" value="false" type="boolean" />
		<attribute name="isaudience" value="false" type="boolean" />
		<attribute name="obj" value="null" />
		<attribute name="roomid" value="0" type="number" />
		<attribute name="starttime" value="" type="string" />
		<attribute name="roomname" value="" type="string" />

		<attribute name="roomClassName" value="conferenceView" type="string" />
		<attribute name="currentusers" value="null" />

		<attribute name="maxUsers" value="4" type="number" />
		
		<attribute name="roomType" value="0" type="number" />

		<attribute name="checkForMaxUsers" value="false" type="boolean" />
		
		<attribute name="publicSID" value="" type="string" />
		<attribute name="user_id" value="0" type="number" />

		<handler name="oninit">
		<![CDATA[

			//if ($debug) Debug.write("obj: ",obj);
			if (this.ispublic) {
				this.maxUsers = obj.numberOfPartizipants;
			} else {
				this.maxUsers = obj.room.numberOfPartizipants;
			}
			this._users.setAttribute('text', canvas.getLabelName(398) + ' '
							+ this.currentusers.length + " / " + this.maxUsers);
			var tString = canvas.getLabelName(401) + "<br/>";
			for (var i = 0; i < this.currentusers.length; i++) {
				tString += this.currentusers[i].firstname + " "
						+ this.currentusers[i].lastname + " ("
						+ this.currentusers[i].username + ") "
						+ canvas.getLabelName(399)
						+ parseDateToStringTime(this.currentusers[i].roomEnter)
						+ " <br/>";
			}
			this._labeltooltip.setAttribute('text', tString);
		]]>
		</handler>

		<handler name="onclick">
			canvas.isConference = !this.isaudience;
			if (this.isaudience)
				connectedIsAudience = '_' + 'audi';
			if (this.ispublic) {
				hib.conferencedomain = "public";
				hib.currentroomid = this.obj.rooms_id;
				//Debug.write("ispublic");
			} else {
				hib.conferencedomain = this.obj.organisation.organisation_id;
				hib.currentroomid = this.obj.room.rooms_id;
				//Debug.write("non ispublic");
			}
			if ($debug) Debug.write("onclick", this);
			parent.parent.parent.parent.parent._roomlistdetails.doinit(
					this.currentusers, this.roomid, this.roomname);
		</handler>

		<method name="checkMaxUsers">
		<![CDATA[
			if (this.currentusers.length < this.maxUsers) {
				this.enterRoom();
			} else {
				new lz.labelerrorPopup(canvas,{errorlabelid:99});
				//new lz.rpcErrorDialog(canvas.main_content._content.inner, {
				//			errorid : 30
				//		});
			}
		]]>
		</method>

		<method name="enterRoom">
			
			var roomid = 0;
			
			if (this.ispublic) {
				roomid = this.obj.rooms_id;
				//Debug.write("ispublic");
			} else {
				roomid = this.obj.room.rooms_id;
				//Debug.write("non ispublic");
			}
			
			canvas.roomJumpId = roomid;
			quicklinkAct("jumpToRoom");
			
			this.doCloseWindow();
		</method>

		<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.oninit.sendEvent();
				if (parent.checkForMaxUsers) {
					parent.checkMaxUsers();
				}
			]]>
			</handler>
		</netRemoteCallHib>

		<labelText text="$once{ parent.roomname }" />

		<labelText name="_users" y="26" />
		<image name="_r" src="$once{ canvas.getThemeImage('reload_rsc') }" x="130" y="26"
			onclick="parent.getRoomClientsListByRoomId.doCall()" >
			<labelTooltip labelid="402" />
		</image>

		<method name="checkConditionsWhenButtonClicked" args="_clicked">
			checkForMaxUsers = true;
			getRoomClientsListByRoomId.doCall();
		</method>
		
		<method name="doCloseWindow">
			if ($debug) Debug.write("doCloseWindow :: ");
			parent.parent.parent.parent.parent.close();
		</method>

		<simpleLabelButton labelid="1135" x="380" width="80" height="24" y="20">
			<handler name="onclick">
				new lz.chatParticipantsInviteMessage(canvas,{
    				    refObj:parent,
    				    publicSID:parent.publicSID,
    				    user_id:parent.user_id,
    				    conferenceRoomName:parent.roomname,
    				    roomId:parent.roomid
    				});
			</handler>
		</simpleLabelButton>

		<labelTooltip multiline="true" name="_labeltooltip" />

	</class>

</library>
