<!--

 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.

-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Cordova-Qt5 Test Page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script language="javascript" type="text/javascript" src="js/cordova.js"></script>
        <script language="javascript" type="text/javascript" src="js/cordova.qt5.js"></script>
        <script language="javascript" type="text/javascript" src="js/connection.js"></script>
        <script language="javascript" type="text/javascript" src="js/console.js"></script>
        <script language="javascript" type="text/javascript" src="js/device.js"></script>
        <script language="javascript" type="text/javascript" src="js/file.js"></script>
        <script language="javascript" type="text/javascript" src="js/geolocation.js"></script>
        <script language="javascript" type="text/javascript" src="js/notification.js"></script>
        <script language="javascript" type="text/javascript" src="js/compass.js"></script>
        <script language="javascript" type="text/javascript" src="js/accelerometer.js"></script>
        <script language="javascript" type="text/javascript" src="js/contacts.js"></script>

        <script language="javascript" type="text/javascript" src="basic.js"></script>

        <style type="text/css">
            input {
                height: 30px;
                margin-top: 15px;
            }
        </style>
    </head>
    <body>
        <input type="button" value="Init Watchers" onclick="init();"/>
        <br />
        <input type="button" value="Vibrate" onclick="test_vibra();"/>
        <br />
        <input type="button" value="Alert/Confirm" onclick="test_alert_confirm();">
        <br />
        <input type="button" value="Check Connection" onclick="getCurrentConnectionType();">
        <br />
        <input type="button" value="Request File System" onclick="test_requestFileSystem();">
        <br />
        <div id="debug_output"> </div>
        <input type="button" value="Get Current Position" onclick="getCurrentPosition();">
        <br />
        <div id="position_val"> Location </div>
        <input type="button" value="Get Acceleration" onclick="getCurrentAcceleration();">
        <br />
        <div id="accel_val"> Acceleration </div>
        <input type="button" value="Get Current Heading" onclick="getCurrentHeading();">
        <br />
        <div id="heading_val"> Heading </div>
        <input type="button" value="Create Test Contact" onclick="createTestContact();">
        <br />
        <div id="create_contact_result"></div>
        <input type="button" value="Search for Test Contact" onclick="searchForTestContact();">
        <br />
        <div id="search_contact_result"></div>
        <input type="button" value="Remove Test Contact" onclick="removeTestContact();">
        <br />
        <div id="remove_contact_result"></div>
    </body>
</html>
