<?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);
		this.mail.setAttribute("text", canvas.mail);
	]]>
	</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>
