<?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.isPasswordProtected){
				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 userObject = new Array();
           
        	canvas.setAttribute('currentuser',canvas.thishib.currentInvitation.invitedEMail);
        	canvas.setAttribute('user_id',-1);
        	canvas.setAttribute('firstName',"");
        	canvas.setAttribute('lastName',canvas.thishib.currentInvitation.invitedEMail);	
        	canvas.setAttribute('mail',canvas.mail);
        	canvas.setAttribute('lastLogin','');
        	canvas.setAttribute('official_code','');
        	canvas.setAttribute('picture_uri','');
        	canvas.setAttribute('language','');					
       
        	userObject["login"] = canvas.thishib.currentInvitation.invitedEMail;
        	userObject["firstname"] = "";
        	userObject["lastname"] = canvas.thishib.currentInvitation.invitedEMail;
        	userObject["adresses"] = new Array();
        	//userObject["adresses"]["emails"] = new Array();
        	userObject["adresses"]["email"] = canvas.thishib.currentInvitation.invitedEMail;
        	//userObject["adresses"]["emails"][0]["mail"] = new Array();
        	//userObject["adresses"]["emails"][0]["mail"]["email"] = canvas.thishib.currentInvitation.invitedEMail;
           
        	hib.userobject = userObject;
           
        	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>
