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

    var deviceReady = false;
    
    /**
     * Function called when page has finished loading.
     */
    function init() {
        document.addEventListener("deviceready", function() {
                deviceReady = true;
                console.log("Device="+device.platform+" "+device.version);
            }, false);
        window.setTimeout(function() {
            if (!deviceReady) {
                alert("Error: Apache Cordova did not initialize.  Demo will not run correctly.");
            }
        },1000);
    }

    /* Battery */
    function updateInfo(info) {
        document.getElementById('level').innerText = info.level;
        document.getElementById('isPlugged').innerText = info.isPlugged;
        if (info.level > 5) {
            document.getElementById('crit').innerText = "false";
        }
        if (info.level > 20) {
            document.getElementById('low').innerText = "false";
        }
    }
    
    function batteryLow(info) {
        document.getElementById('low').innerText = "true";
    }
    
    function batteryCritical(info) {
        document.getElementById('crit').innerText = "true";
    }
    
    function addBattery() {
        window.addEventListener("batterystatus", updateInfo, false);
    }
    
    function removeBattery() {
        window.removeEventListener("batterystatus", updateInfo, false);
    }
    
    function addLow() {
        window.addEventListener("batterylow", batteryLow, false);
    }
    
    function removeLow() {
        window.removeEventListener("batterylow", batteryLow, false);
    }
    
    function addCritical() {
        window.addEventListener("batterycritical", batteryCritical, false);
    }
    
    function removeCritical() {
        window.removeEventListener("batterycritical", batteryCritical, false);
    }

</script>

  </head>
  <body onload="init();" id="stage" class="theme">
  
    <h1>Battery</h1>
    <div id="info">
        <b>Status:</b> <span id="battery_status"></span><br>
        Level: <span id="level"></span><br/>
        Plugged: <span id="isPlugged"></span><br/>
        Low: <span id="low"></span><br/>
        Critical: <span id="crit"></span><br/>
    </div>
    <h2>Action</h2>
    <div class="btn large" onclick="addBattery();">Add "batterystatus" listener</div>
    <div class="btn large" onclick="removeBattery();">Remove "batterystatus" listener</div>
    <div class="btn large" onclick="addLow();">Add "batterylow" listener</div>
    <div class="btn large" onclick="removeLow();">Remove "batterylow" listener</div>
    <div class="btn large" onclick="addCritical();">Add "batterycritical" listener</div>
    <div class="btn large" onclick="removeCritical();">Remove "batterycritical" listener</div>
    <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
  </body>
</html>      
