<?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.
  
-->
<canvas debug="false" width="100%" height="100%" title="NetworkTesting">

    <include href="testsView.lzx" />

    <!--
        These attributes are rewritten by values from "networktesting-config.xml"
    -->
    <attribute name="host" type="string" value="" />
    <attribute name="rtmpPort" type="number" value="1935" />
    <attribute name="httpPort" type="number" value="5080" />
    <attribute name="uriContext" type="string" value="/openmeetings" />
    <attribute name="rtmpUriPath" type="string" value="/openmeetings/hibernate" />

    <method name="getSettings">
        var settingsPtr = canvas.settings.getPointer();

        canvas.setAttribute("host", settingsPtr.xpathQuery("config/hostAddress/text()"));
        canvas.setAttribute("rtmpPort", settingsPtr.xpathQuery("config/rtmpPort/text()"));
        canvas.setAttribute("httpPort", settingsPtr.xpathQuery("config/httpPort/text()"));

        canvas.setAttribute("uriContext", settingsPtr.xpathQuery("config/uriContext/text()"));
        canvas.setAttribute("rtmpUriPath", settingsPtr.xpathQuery("config/rtmpUriPath/text()"));
    </method>

    <method name="showTests">
        var tests = new lz.TestsView(canvas, {name:"testsView"});
        tests.testAll();
    </method>

    <dataset type="http" name="settings" request="false" >
        <handler name="oninit">
            this.setAttribute("src","networktesting-config.xml");
            this.doRequest();
        </handler>
        <handler name="ondata">
            if ($debug) Debug.write("Settings are retrieved");
            canvas.getSettings();
            canvas.showTests();
        </handler>
        <handler name="onerror" args="e">
            if ($debug) Debug.write("Settings error", e);
        </handler>
        <handler name="ontimeout" args="e">
            if ($debug) Debug.write("Settings timeout error", e);
        </handler>
    </dataset>

    <attribute name="busy" type="boolean" value="false"/>
    <attribute name="log" type="string" value="" />

    <attribute name="testsView" value="null"/>

</canvas>
