<?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="true" width="100%" height="100%" fontsize="14" title="OpenMeetings - Computer testing">
	
	<debug fontsize="14" oninit="Debug.showInternalProperties = true"/>

                <edittext name="url" width="400"> 
                    <handler name="onkeyup" args="key">
                        if ((key == 27) || (key == 13)) {
                            this.parent.readStart.onclick.sendEvent();
                        }
                    </handler>
                </edittext>
                
                <button name="readStart" width="200" x="400" text="LOAD"
                                y="2">
                    <handler name="onclick">
                        <![CDATA[
                            var url = parent.url.getText();
                            if ((url.indexOf("http://") < 0)
                                    && (url.indexOf("https://") < 0)) {
                                url = "http://" + url;
                            }
    
                            parent.htmlviewer.setAttribute("src",url);
                            parent.htmlviewer.setAttribute("visible",true);
    
                        ]]>
                    </handler>
                </button>
                
        <html name="htmlviewer" x="4" y="60" width="600" height="500" bgcolor="0xCCCCCC" >
            <handler name="onloading" args="loading">
                this.loading = loading;
                if ($debug) Debug.write("LOADING ",loading);
            </handler>
            <handler name="onsrc" args="src">
                this.src = src;
                if ($debug) Debug.write("SRC ",loading);
            </handler>
        </html>
	
</canvas>
