<!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.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>

