<?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="chooseNickName" extends="labelExplorerBox" labelid="1287"
    docking="true" resizeable="false" closable="false" 
    width="324" x="$once{ parent.width/2 - this.width/2 }" y="100" height="200">

    <handler name="oninit">
    	<![CDATA[
    	
    	   var tFirstname = "Guest"
    	   var tLastname = "User "+getStringTimeWithSeconds();
    	
    	   this.firstName.setAttribute("text",tFirstname);
    	   this.lastName.setAttribute("text",tLastname);
    	
    	]]>
    </handler>

    <!--
    public Long setUserNickName(String firstname, String lastname, String email)
     -->
    <netRemoteCallHib name="setUserNickName" activeErrorHandler="true" 
                        funcname="xmlcrm.setUserNickName" remotecontext="$once{ canvas.thishib }">          
        <netparam><method name="getValue">return parent.parent.firstName.getText();</method></netparam>
        <netparam><method name="getValue">return parent.parent.lastName.getText();</method></netparam>
        <netparam><method name="getValue">return parent.parent.mail.getText();</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("setUserNickName -1-: ",value);
                
                if (value<0){
                    
                } else {
                    canvas.thishib.getCurrentRoomClient.doCall();
                    parent.close();
                }
            ]]>
        </handler>   
    </netRemoteCallHib> 

	<labelText y="26" x="4" labelid="1288" />
		<customEdittext name="firstName" y="24" x="120" width="200" text="" />
		
	<labelText y="56" x="4" labelid="1289" />
		<customEdittext name="lastName" y="54" x="120" width="200" text="" />
		
	<labelText y="86" x="4" labelid="1290" />
		<customEdittext name="mail" y="84" x="120" width="200" 
						regexpType="email" text="" />

	<simpleLabelButton name="connect" x="$once{ parent.width-this.width-10 }" 
					   y="$once{ parent.height-30 }" labelid="1291" width="120" >
		<handler name="onclick">
			<![CDATA[
    			if (parent.firstName.getText().length < 4) {
    				new lz.labelerrorPopup(canvas,{errorlabelid:1292});
    				return;
    			} else if (parent.lastName.getText().length < 4) {
                    new lz.labelerrorPopup(canvas,{errorlabelid:1292});
                    return;
                } else if (parent.mail.getText() == "") {
                    new lz.labelerrorPopup(canvas,{errorlabelid:1293});
                    return;
                }
            
                this.parent.setUserNickName.doCall();
            ]]>    
		</handler>
	</simpleLabelButton>
		
</class>

</library>
