<?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>

<!--- Admin module to configure the Conference or Audience room.-->
<class name="roomAdmin" extends="baseContentView">	

	<handler name="oninit">
		_mainScrollHBar.setAttribute("visibility","visible");
	</handler>
	
	<handler name="ontabcontentleave" args="tRef">
		_mainScrollHBar.setAttribute("visibility","hidden");
	</handler>
	
	<labelText x="2" y="${ 8 - parent.parent.parent.y }" labelid="714" />
	
	<customEdittext name="_search" y="${ 4 - parent.parent.parent.y }" x="120" width="200" height="24"/>
    
    <simpleLabelButton labelid="715" x="330" width="70" height="24" y="${ 4 - parent.parent.parent.y }">
        <handler name="onclick">
            parent._turnoverlist.getRooms.doCall();
        </handler>
    </simpleLabelButton>
	
	<turnOverList name="_turnoverlist" width="400" height="${ canvas.height - canvas.naviHeight - 40 }" x="2" y="${ 30 - parent.parent.parent.y }" 
		orderby="c.rooms_id" step="50" asc="true">

		<handler name="oninit">
			this.addHeaderItem(188,60);
			this.addHeaderItem(189,184);
			this.addHeaderItem(190,134);
			this.getRooms.doCall();
		</handler>
		
		<handler name="oncallnext" >
			this.getRooms.doCall();
		</handler>
		
		<handler name="oncallpre" >		
			this.getRooms.doCall();
		</handler>
		
		<handler name="onclickedItem" args="obj">
			//Debug.write("onclickedItem",obj,obj.obj);
            parent._roomvalueform.hideNewRecordText();
			parent._roomvalueform.initValueFieldsByObject(obj.obj);
		</handler>
		
		<netRemoteCallHib name="getRooms" funcname="conferenceservice.getRooms" remotecontext="$once{ canvas.thishib }" >      
			<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
			<netparam><method name="getValue"> return parent.parent.start; </method></netparam>
			<netparam><method name="getValue"> return parent.parent.step; </method></netparam>
			<netparam><method name="getValue"> return parent.parent.orderby; </method></netparam>
			<netparam><method name="getValue"> return parent.parent.asc; </method></netparam>
	    	<netparam><method name="getValue"> return parent.parent.parent._search.getText(); </method></netparam>
            <handler name="ondata" args="value">
	    		//Debug.write("getRooms: ",value);
	    		//this.parent.destroy();
	    		this.parent.initValues(value.records);
	    		this.parent.renderContent(value.result);
	    	</handler>
	    </netRemoteCallHib>	
	    
	    <method name="renderContent" args="records">
	    	<![CDATA[
	    	this.clearList();
	    	for (var i=0;i<records.length;i++){
	    		new lz.roomAdminListItem(this._innerlist._inn._inn,{obj:records[i],rooms_id:records[i].rooms_id,roomname:records[i].name,ispublic:records[i].ispublic});
	    	}
	    	if (parent._roomvalueform.rooms_id == 0) {
                if (records.length > 0) {
                    parent._roomvalueform.initValueFieldsByObject(records[0]);
                }
            }
            this.sendInitialWidthUpdate();
	    	]]>
	    </method>

	</turnOverList>
	
	<roomValueForm name="_roomvalueform" x="402">
        <handler name="onnew" args="refObj">
            parent._turnoverlist.clearSelection();
        </handler>
    </roomValueForm>
		
</class>



</library>
