﻿<!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=yes, initial-scale=2.0, maximum-scale=4.0, minimum-scale=1.0" / -->
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
    <title>Cordova</title>
    <link rel="stylesheet" href="master.css" type="text/css" media="screen"/>



    <script type="text/javascript" charset="utf-8" src="cordova-current.js"></script>


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


  //-------------------------------------------------------------------------
  // Acceleration
  //-------------------------------------------------------------------------
  var watchAccelId = null;

  /**
  * Start watching acceleration
  */
  var watchAccel = function() {
  console.log("watchAccel()");

  if(watchAccelId)
  {
      return;
  }

  // Success callback
  var success = function (a) {
  document.getElementById("ball").style.left = parseInt(a.x * 100 + 100) + "px" ;
  document.getElementById("ball").style.top = parseInt(a.z * 100 + 100) + "px" ;

  };

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

  // Update acceleration every 1 sec
  var opt = {};
  opt.frequency = 50;
  watchAccelId = navigator.accelerometer.watchAcceleration(onAccelData, fail, opt);

  setAccelStatus("Running");
  };


  var ballX = 0;
  var ballY = 0;
  var ballPixelsPerUpdate = 10;

  function onAccelData(a)
  {
  ballX += a.x * ballPixelsPerUpdate;
  ballY += a.z * ballPixelsPerUpdate;

  ballX = Math.max(ballX,0);
  ballX = Math.min(ballX,200);

  ballY = Math.max(ballY,0);
  ballY = Math.min(ballY,200);


  document.getElementById("ball").style.left = ballX + "px" ;
  document.getElementById("ball").style.top = ballY +  "px" ;
  }

  /**
  * Stop watching the acceleration
  */
  var stopAccel = function() {
  console.log("stopAccel()");
  if (watchAccelId) {
  navigator.accelerometer.clearWatch(watchAccelId);
  watchAccelId = null;
  }
  };


  /**
  * Function called when page has finished loading.
  */
  function init() {

  document.addEventListener("deviceready", function() {
  console.log("Device="+device.platform+" "+device.version);
  }, false);
  }

</script>

<style>
	#ball
	{
		position:relative;
		width:20px;
		height:20px;
		border-radius:10px;
		background-color:#FFF;
	}

	#playfield
	{
		position:absolute;
		left:50px;
		top:220px;
		width:220px;
		height:220px;
		background-color:#ff8800;
	}

	.dButton
	{
		width:80px;
		height:40px;
		display:inline;
		float:left;
		clear:none;
		border-style:solid;
		border-width:1px;
		border-radius:2px;
		line-height:40px;
	}

	.backBtnz
	{
		position:absolute;
		bottom:-20px;
	}
</style>

  </head>
  <body onLoad="init();" id="stage" class="theme">

    <div id="playfield">
    	<div id="ball">

        </div>
    </div>

    <h2>Actions</h2>

    <div class="dButton" onclick="watchAccel();">Start</div>
    <div class="dButton" onclick="stopAccel();">Stop</div>

    <div/>
    <a href="index.html" class="backBtn backBtnz">Back</a>
  </body>
</html>
