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

    var deviceReady = false;

    function roundNumber(num) {
        var dec = 3;
        var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
        return result;
    }

    //-------------------------------------------------------------------------
    // Compass
    //-------------------------------------------------------------------------
    var watchCompassId = null;

    /**
     * Start watching compass
     */
    var watchCompass = function() {
        console.log("watchCompass()");

        // Success callback
        var success = function(a){
            document.getElementById('compassHeading').innerHTML = roundNumber(a.magneticHeading);
        };

        // Fail callback
        var fail = function(e){
            console.log("watchCompass fail callback with error code "+e);
            stopCompass();
            setCompassStatus(e);
        };

        // Update heading every 1 sec
        var opt = {};
        opt.frequency = 1000;
        watchCompassId = navigator.compass.watchHeading(success, fail, opt);

        setCompassStatus("Running");
    };

    /**
     * Stop watching the acceleration
     */
    var stopCompass = function() {
        setCompassStatus("Stopped");
        if (watchCompassId) {
            navigator.compass.clearWatch(watchCompassId);
            watchCompassId = null;
        }
    };

    /**
     * Get current compass
     */
    var getCompass = function() {
        console.log("getCompass()");

        // Stop compass if running
        stopCompass();

        // Success callback
        var success = function(a){
            document.getElementById('compassHeading').innerHTML = roundNumber(a.magneticHeading);
        };

        // Fail callback
        var fail = function(e){
            console.log("getCompass fail callback with error code "+e);
            setCompassStatus(e);
        };

        // Make call
        var opt = {};
        navigator.compass.getCurrentHeading(success, fail, opt);
    };

    /**
     * Set compass status
     */
    var setCompassStatus = function(status) {
        document.getElementById('compass_status').innerHTML = status;
    };
    
    /**
     * 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: PhoneGap did not initialize.  Demo will not run correctly.");
        	}
        },1000);
    }

</script>

  </head>
  <body onload="init();" id="stage" class="theme">
  
    <h1>Compass</h1>
    <div id="info">
        <b>Status:</b> <span id="compass_status">Stopped</span>
        <table width="100%"><tr>
            <td width="33%">Heading: <span id="compassHeading"> </span></td>
        </tr></table>
    </div>
    <h2>Action</h2>
    <div class="btn large" onclick="getCompass();">Get Compass</div>
    <div class="btn large" onclick="watchCompass();">Start Watching Compass</div>
    <div class="btn large" onclick="stopCompass();">Stop Watching Compass</div>
    <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
  </body>
</html>      
