<?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="sipDialer" extends="window" bgcolor="gray" width="200">
    <simplelayout axis="y" spacing="5"/>
    <labelText labelid="1003"/>
    <view name="phoneNumber" width="100%">
        <inputtext name="input" width="$once{parent.width-parent.del.width}" height="20" bgcolor="white"/>
        <button name="del" x="$once{parent.input.width}" width="30" height="20" onclick="this.del();">
            ←
            <method name="del">
                var t = parent.input.text;
                if(t.length != 0) {
                    t = t.substr(0, t.length - 1);
                    parent.input.setAttribute('text', t);
                }
            </method>
        </button>
    </view>

    <view name="dialerButtons" align="center">
        <vbox spacing="5">
            <hbox spacing="5">
                <button onclick="parent.parent.parent.parent.dial('1')" width="40">1</button>
                <button onclick="parent.parent.parent.parent.dial('2')" width="40">2</button>
                <button onclick="parent.parent.parent.parent.dial('3')" width="40">3</button>
            </hbox>
            <hbox spacing="5">
                <button onclick="parent.parent.parent.parent.dial('4')" width="40">4</button>
                <button onclick="parent.parent.parent.parent.dial('5')" width="40">5</button>
                <button onclick="parent.parent.parent.parent.dial('6')" width="40">6</button>
            </hbox>
            <hbox spacing="5">
                <button onclick="parent.parent.parent.parent.dial('7')" width="40">7</button>
                <button onclick="parent.parent.parent.parent.dial('8')" width="40">8</button>
                <button onclick="parent.parent.parent.parent.dial('9')" width="40">9</button>
            </hbox>
            <hbox spacing="5">
                <button onclick="parent.parent.parent.parent.dial('*')" width="40">*</button>
                <button onclick="parent.parent.parent.parent.dial('0')" width="40">0</button>
                <button onclick="parent.parent.parent.parent.dial('#')" width="40">#</button>
            </hbox>
        </vbox>
    </view>
    <hbox spacing="10" align="center">
        <simpleLabelButton labelid="1448" name="callButton">
            <handler name="onclick">
                parent.parent.joinToConfCall.doCall();
            </handler>
        </simpleLabelButton>
        <simpleLabelButton labelid="85" name="closeButton">
            <handler name="onclick">
                canvas.sipDialer = null;
                parent.parent.destroy();
            </handler>
        </simpleLabelButton>
    </hbox>
    <handler name="oninit">
        if(canvas.sipDialer != null) {
            canvas.sipDialer.destroy();
        }
        canvas.setAttribute('sipDialer', this);
        this.bringToFront();
    </handler>

    <method name="dial" args="digit">
        this.phoneNumber.input.setAttribute('text', this.phoneNumber.input.text + digit);
    </method>

    <netRemoteCallHib name="joinToConfCall" funcname="joinToConfCall" remotecontext="$once{ canvas.thishib }">
        <netparam><method name="getValue">return parent.parent.phoneNumber.input.text</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
            //The onResult-Handler will be called be the rtmpconnection
            if($debug) Debug.write("joinToConfCall : ",value);
            ]]>
        </handler>
    </netRemoteCallHib>
</class>

</library>