<!DOCTYPE html>
<!--

 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.

-->


<html>
  <head>
    <meta name="viewport" content="width=device-width,height=device-height,user-scalable=no,maximum-scale=1.0,initial-scale=1.0" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <!-- ISO-8859-1 -->
    <title>Cordova Mobile Spec</title>
    <link rel="stylesheet" href="../master.css" type="text/css" media="screen" title="no title" charset="utf-8">
    <script type="text/javascript" charset="utf-8" src="../cordova-incl.js"></script>

      
<script type="text/javascript" charset="utf-8">


    function eventOutput(s) {
        var el = document.getElementById("results");
        el.innerHTML = el.innerHTML + s + "<br>";
    }

    function printNetwork() {
        eventOutput("navigator.connection.type=" + navigator.connection.type);
        eventOutput("navigator.network.connection.type=" + navigator.network.connection.type);
    }

    /**
     * Function called when page has finished loading.
     */
    function init() {
        var deviceReady = false;
        function onEvent(e) {
            eventOutput('Event of type: ' + e.type);
            printNetwork();
        }
        document.addEventListener('online', onEvent, false);
        document.addEventListener('offline', onEvent, false);
        document.addEventListener("deviceready", function() {
            deviceReady = true;
            eventOutput("Device="+device.platform+" "+device.version);
            printNetwork();
        }, false);
        window.setTimeout(function() {
            if (!deviceReady) {
                alert("Error: Cordova did not initialize.  Demo will not run correctly.");
            }
        }, 1000);
    }

</script>

  </head>
  <body onload="init();" id="stage" class="theme">
  
    <h1>Network Events and State</h1>
    <div id="info">
        <b>Results:</b><br>
        <span id="results"></span>
    </div>

    <h2>Action</h2>
    <div class="btn large" onclick="printNetwork();">Show Network Connection</div>
    <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
  </body>
</html>

