<?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>
	<!---
	-->
	<!-- label: data loading, please wait -->
	<class name="invitationQuickLoader" extends="labelExplorerBox" labelid="230"
			docking="true" resizeable="false" closable="false" width="324" 
			x="$once{ canvas.width/2 - this.width/2 }" y="0" height="120">
		 
		<attribute name="userlang" value="1" type="number" />
		
		<handler name="oninit">
			this.setRoomValues();
			if (canvas.thishib.currentInvitation.passwordProtected){
				if ($debug) Debug.write("Is Password Protected");
				this.pass_label.setAttribute('visibility','visible');
				this._password.setAttribute('visibility','visible');
				this.invitation_pass.setAttribute('visibility','visible');
			} else {
				this.showLoginStep();
                if ($debug) Debug.write("invitationQuickLoader:oninit userlang = [",userlang,"]; canvas.lang = [",canvas.language_id,"]");
                if (canvas.language_id > 0) {
                    this.isRoomFull.doCall();
                } else {
                    this.showLoginStep();
                }
			}
		</handler>
		
		<method name="showLoginStep">
			this.pass_label.setAttribute('visibility','hidden');
			this._password.setAttribute('visibility','hidden');
			this.invitation_pass.setAttribute('visibility','hidden');		
			this.labellanguages.setAttribute('visibility','visible');
			this.languages.setAttribute('visibility','visible');
			this.connect.setAttribute('visibility','visible');
		</method>
		
		<method name="checkPWD">
			this.checkInvitationPass.doCall();
		</method>
		
		<netRemoteCallHib name="isRoomFull" funcname="conferenceservice.isRoomFull" 
							remotecontext="$once{ canvas.thishib }" activeErrorHandler="true" >  	
        	<netparam name="pass"><method name="getValue">return canvas.thishib.currentInvitation.room.rooms_id;</method></netparam>
        	<handler name="ondata" args="value">
        		<![CDATA[
            		//The onResult-Handler will be called be the rtmpconnection
            		if ($debug) Debug.write(canvas.thishib.currentInvitation.room.rooms_id);
					if ($debug) Debug.write("isRoomFull: ",value);
					
					if (value) {
						new lz.labelerrorPopup(canvas,{errorlabelid:618});
						parent.close();
					} else {
						parent.login();
					}
            	]]>
        	</handler>   
    	</netRemoteCallHib> 
		
		<netRemoteCallHib name="checkInvitationPass" funcname="invitationservice.checkInvitationPass" 
							remotecontext="$once{ canvas.thishib }" activeErrorHandler="true" >  	
	      	<netparam name="invitationHash"><method name="getValue">return canvas.invitationHash;</method></netparam>
        	<netparam name="pass"><method name="getValue">return parent.parent._password.getText();</method></netparam>
	        	
        	<handler name="ondata" args="value">
        		<![CDATA[
            		//The onResult-Handler will be called be the rtmpconnection
				if ($debug) Debug.write("checkInvitationPass : ",value);
				if (value<0){
				} else {
					parent.showLoginStep();
				}
            ]]>
        	</handler>   
    	</netRemoteCallHib>  	
	    
		<method name="setRoomValues">
			if (canvas.thishib.currentInvitation.room.roomtype.roomtypes_id==1){
	    		canvas.isConference = true;
	    	} else {
	    		canvas.isConference = false;
		    }
	    	var roomObj = canvas.thishib.currentInvitation.room;
        	hib.currentroomid = roomObj.rooms_id;
        	
		</method>
		
		<method name="login">
			this.userlang = Number(this.languages.getValue());
			this.labellanguages.setAttribute('visibility','hidden');
			this.languages.setAttribute('visibility','hidden');
			this.connect.setAttribute('visibility','hidden');
			this.labelloading.setAttribute('visibility','visible');
			
			parent.userlang = Number(this.userlang);
			
			var invitee = canvas.thishib.currentInvitation.invitee;
			var email = invitee.adresses.email;
			var fName = invitee.firstname == null ? "" : invitee.firstname;
			var lName = invitee.lastname == null ? email : invitee.lastname;
			
			canvas.setAttribute('currentuser', email);
			canvas.setAttribute('user_id', -invitee.user_id);
			canvas.setAttribute('firstName', fName);
			canvas.setAttribute('lastName', lName);
			canvas.setAttribute('mail', email);
			canvas.setAttribute('lastLogin', invitee.lastlogin);
			canvas.setAttribute('official_code','');
			canvas.setAttribute('picture_uri', invitee.pictureuri);
			canvas.setAttribute('language', invitee.language_id);
			
			hib.userobject = invitee;
			hib.userobject.firstname = fName;
			hib.userobject.lastname = lName;
			
			hib.userlang = Number(this.userlang);
			canvas.thishib.loaderVar = new lz.autoloaderBarOnly(canvas);
			canvas.thishib.loaderVar.setProgress();
			this.close();
			canvas.thishib.loaderVar.getLanguageByIdAndMax.doCall();         
		</method>
		 
		<!-- label: password -->
	    	<labelText name="pass_label" labelid="536" visibility="hidden" width="200" y="30" resize="false" x="10" />  
		<customEdittext name="_password" password="true" visibility="hidden" width="170" y="30" x="120" />
		
		<!-- label: Check password -->
	 	<simpleLabelButton name="invitation_pass" y="80" x="120" text="start" visibility="hidden" labelid="537"
	 					   	width="170" height="20" onclick="parent.checkPWD();" />
		
		<!-- label: language -->
		<labelText name="labellanguages" labelid="227" visibility="hidden" width="200" y="30" resize="false" x="10" />     
		<resetCombobox name="languages" width="170" y="30" x="120" visibility="hidden" editable="false">
	      	<netRemoteCallHib name="getLanguages" funcname="languageservice.getLanguages" remotecontext="$once{ canvas.thishib }" >      
	            <handler name="oninit">
                 	this.doCall();
	            </handler>
	            <handler name="ondata" args="value">
	            	//The onResult-Handler will be called be the rtmpconnection
                  	<![CDATA[
                        var selVal = canvas.language_id;
                        var found = false;
                  		for (var i=0;i<value.length;i++){
	                  		this.parent.addItem(value[i].name,value[i].language_id);
                            if (value[i].language_id == selVal) {
                                found = true;
                            }
		                }
                		this.parent.selectItem((found) ? selVal : value[0].language_id);
		            ]]>
				</handler>  
			</netRemoteCallHib>
		</resetCombobox>		 

		<!-- label: loading -->	
		<labelText name="labelloading" y="30" x="10" fontstyle="bold" labelid="229" visibility="hidden" />
		
		<!-- label: enter -->
		<simpleLabelButton name="connect" y="80" x="120" text="start" 
						   visibility="hidden" labelid="228" width="170" height="20" 
						   onclick="parent.isRoomFull.doCall();" />
	</class>
</library>
