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

<!--- Popup view to input a new language name to be added. -->
<class name="addLanguage" extends="labelExplorerBox" labelid="364"
    docking="true" resizeable="false" closable="true" 
	width="360" x="350" height="160">
	<!-- 364:Add new language -->
	
	<attribute name="refObj" value="null" />

    <handler name="oninit">
        var pressEnter = new LzDelegate(this, "sendValues");
        lz.Keys.callOnKeyCombo(pressEnter, ["enter"]);
	</handler>  
	
	<method name="sendValues">
		<![CDATA[
			this.addLanguage.doCall();
		]]>
	</method>
	
    <netRemoteCallHib name="addLanguage" funcname="languageservice.addLanguage" 
		remotecontext="$once{ canvas.thishib }" activeErrorHandler="true"
		isCallBackHandler="true" >      
		<attribute name="tempValue" value="0" type="number" />
        <netparam><method name="getValue"> return canvas.sessionId;</method></netparam> 
        <netparam><method name="getValue"> return parent.parent.langName.getText();</method></netparam>  
        <netparam><method name="getValue"> return parent.parent.langCode.getText();</method></netparam>  
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
			if($debug) Debug.write(value);
			parent.refObj.languages.getLanguages.doCall();
			parent.close();
        </handler>  
    </netRemoteCallHib>	      	
   
    <!-- 365:Name -->
    <labelText labelid="365" width="200" y="54" x="2"/>
        <customEdittext name="langName" y="54" x="140" width="170" />
	
    <!-- 1422:Code -->
    <labelText labelid="1422" width="200" y="74" x="2"/>
        <customEdittext name="langCode" y="74" x="140" width="170" />
	
	<!-- 366:add language  -->
    <simpleLabelButton name="_btn" labelid="366" width="120" x="230" 
		y="$once{ parent.height-40 }" onclick="parent.sendValues()" />   
	
</class>    

</library>
