Updated application sources
[apps/web/sample/SensorBall.git] / project / js / main.js
index df5b632..7c5d8ca 100644 (file)
  *      limitations under the License.
  */
 
-/*global $: false, tizen: false, navigator: false, app: true*/
+/*jslint devel:true*/
+/*global $: false, tizen: false, navigator: false, window, app: true*/
 
 var app = {
-       sensor: null,
-       R: 2000.0, // // gravity constant * m * M
-
-       gameWidth: 0,
-       gameHeight: 0,
-       ballWidth: 0,
-       ballHeight: 0,
-       sunWidth: 0,
-       sunHeight: 0,
-       ballX: 0,
-       ballY: 0,
-       dX: 0,
-       dY: 0,
-       sunX: 0,
-       sunY: 0,
-
-       backgroundWidth: 0,
-       backgroundHeight: 0,
-       backgroundTop: 0,
-       backgroundLeft: 0,
-
-       resistance: 0.98, // air
-       friction: 0.90, // bounce
-       sideFriction: 0.95,
-       frictionC: 0.002,
-       repulse: 0.6,
-       cdd: -0.3,
-
-       timeout: null,
-       current: 'ball',
-       event: null,
-       animationInterval: 40,
-
-       /**
-        * Draw earth background position
-        * @param {int} x current x earth position
-        * @param {int} y current y earth position
-        */
-       earthUpdateBackgroundPosition: function earthUpdateBackgroundPosition(x, y) {
-               "use strict";
-               var rX, rY,
-                       cX, cY,
-                       tX, tY,
-                       bdX, bdY,
-                       br;
-
-               rX = -30.0;
-               rY = -30.0;
-
-               cX = (this.gameWidth - this.backgroundWidth) / 2;
-               cY = (this.gameHeight - this.backgroundHeight) / 2;
-
-               tX = cX + (-x * rX);
-               tY = cY + (y * rY);
-
-               bdX = tX - this.backgroundLeft;
-               bdY = tY - this.backgroundTop;
-
-               br = 0.2;
-
-               this.backgroundLeft += bdX * br;
-               this.backgroundTop += bdY * br;
-
-               $('.background').css('background-position', (this.backgroundLeft - 330) + 'px ' + (this.backgroundTop - 330) + 'px');
-       },
-
-       /**
-        * Draw sun position
-        * @param {int} x current x earth position
-        * @param {int} y current y earth position
-        */
-       earthUpdateSunPosition: function earthUpdateSunPosition(x, y) {
-               "use strict";
-               var rX, rY,
-                       cX, cY,
-                       tX, tY,
-                       bdX, bdY,
-                       br;
-
-               rX = -8.0;
-               rY = -8.0;
-
-               cX = (this.gameWidth - this.sunWidth) / 2;
-               cY = (this.gameHeight - this.sunHeight) / 2;
-
-               tX = cX + (-x * rX);
-               tY = cY + (y * rY);
-
-               bdX = tX - this.sunX;
-               bdY = tY - this.sunY;
-
-               br = 0.2;
-
-               this.sunX += bdX * br;
-               this.sunY += bdY * br;
-
-               $('#sun').css('left', this.sunX + 'px');
-               $('#sun').css('top', this.sunY + 'px');
-               $('#sun').show();
-       },
-
-       /**
-        * Deceleration - used when the earth leaves the Sun's gravitation
-        */
-       deceleration: function deceleration() {
-               "use strict";
-               this.dX *= 0.6;
-               this.dY *= 0.6;
-       },
-
-       /**
-        * Draw the next animation frame for the 'earth' tab
-        */
-       earthEvents: function earthEvents() {
-               "use strict";
-
-               var event, borderTolerance,
-                       x, y,
-                       dXl, dYl,
-                       d,
-                       d2,
-                       ddx, ddy,
-                       ratio;
-
-               event = this.event;
-               borderTolerance = 30;   // when Earth reach a border, then Earth is "moving"
-
-               x = -event.accelerationIncludingGravity.x;
-               y = -event.accelerationIncludingGravity.y;
-
-               // calculate X and Y distances between the Sun and Earth
-               dXl = (this.sunX + this.sunWidth / 2 - (this.ballX + (this.ballWidth / 2))); // x distance
-               dYl = (this.sunY + this.sunHeight / 2 - (this.ballY + (this.ballHeight / 2))); // y distance
-
-               if (Math.abs(dXl) < 1) {
-                       dXl = dXl < 0 ? -1 : 1; // round to 1 * sign
-               }
-               if (Math.abs(dYl) < 1) {
-                       dYl = dYl < 0 ? -1 : 1; // round to 1 * sign
-               }
-
-               // distance squared
-               d2 = Math.pow(dXl, 2) + Math.pow(dYl, 2);
-               // distance
-               d = Math.sqrt(d2);
-
-               // acceleration is proportional to 1/d2 [a=GM/r^2]
-               // X component is also proportional to dXl / d
-               ddx = (this.R * dXl) / (d2 * d);
-               ddy = (this.R * dYl) / (d2 * d);
-
-               // apply acceleration to speed
-               this.dX += ddx;
-               this.dY += ddy;
-
-               ratio = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2)) / 25; // max speed
-               if (ratio > 1) { // speed limit achieved
-                       this.dX /= ratio;
-                       this.dY /= ratio;
-               }
-
-               // apply speed to Earth position
-               this.ballX += this.dX;
-               this.ballY += this.dY;
-
-               // What do it when the earth leaves gravitation of the Sun?;
-               if (this.ballX > (this.gameWidth + borderTolerance)) {
-                       this.ballX = -borderTolerance; this.deceleration();
-               }
-               if (this.ballY > (this.gameHeight + borderTolerance)) {
-                       this.ballY = -borderTolerance; this.deceleration();
-               }
-               if (this.ballX < -borderTolerance) {
-                       this.ballX = this.gameWidth + borderTolerance; this.deceleration();
-               }
-               if (this.ballY < -borderTolerance) {
-                       this.ballY = this.gameHeight + borderTolerance; this.deceleration();
-               }
-
-               // update Earth position
-               $('.ball').css('left', this.ballX + 'px');
-               $('.ball').css('top', this.ballY + 'px');
-
-               // relative depth Sun / Earth
-               if (this.dY > 0) {
-                       $('.ball').css('z-index', 100);
-               } else {
-                       $('.ball').css('z-index', 20);
-               }
-
-               this.earthUpdateBackgroundPosition(x, y);
-               this.earthUpdateSunPosition(x, y);
-       },
-
-       /**
-        *  Checks if the ball already was on the edge in the previous step
-        *
-        *  If so, this is not a 'real' bounce - the ball is just laying on the edge
-        *  Uses globals: ballX, ballY, ballWidth, ballHeight, gameWidth, gameHeight
-        *
-        *  @return {Object}
-        */
-       shouldVibrateIfHitsEdge: function shouldVibrateIfHitsEdge() {
-               "use strict";
-               var ret = {
-                       x: true,
-                       y: true
-               };
-
-               if (this.ballX <= 0) {
-                       ret.x = false;
-               } else if ((this.ballX + this.ballWidth) >= this.gameWidth) {
-                       ret.x = false;
-               }
-               if (this.ballY <= 0) {
-                       ret.y = false;
-               } else if ((this.ballY + this.ballHeight) >= this.gameHeight) {
-                       ret.y = false;
-               }
-
-               return ret;
-       },
-
-       /**
-        * Draw the next animation frame for the 'ball' tab
-        */
-       ballEvents: function ballEvents() {
-               "use strict";
-               var event,
-                       x,
-                       y,
-                       stickTop = 0,
-                       stickLeft = 0,
-                       stickBottom = 0,
-                       stickRight = 0,
-                       rX,
-                       rY,
-                       ddx,
-                       ddy,
-                       shouldVibrate = null,
-                       isHittingEdge = null;
-
-               event = this.event;
-
-               x = -event.accelerationIncludingGravity.x;
-               y = -event.accelerationIncludingGravity.y;
-
-               stickTop = 0;
-               stickLeft = 0;
-               stickBottom = 0;
-               stickRight = 0;
-
-               rX = this.ballX;
-               rY = this.ballY;
-               ddx = x * -this.cdd;
-               ddy = y * this.cdd;
-               this.dX += ddx;
-               this.dY += ddy;
-               this.dX *= this.resistance;
-               this.dY *= this.resistance;
-
-               shouldVibrate = this.shouldVibrateIfHitsEdge();
-
-               this.ballX += this.dX;
-               this.ballY += this.dY;
-
-               if (this.ballX < 0) {
-                       this.ballX = 0;
-                       this.dX = Math.abs(this.dX) * this.friction - this.frictionC;
-                       this.dY *= this.sideFriction;
-                       stickLeft = 1;
-               } else if ((this.ballX + this.ballWidth) > this.gameWidth) {
-                       this.ballX = this.gameWidth - this.ballWidth;
-                       this.dX = -Math.abs(this.dX) * this.friction + this.frictionC;
-                       this.dY *= this.sideFriction;
-                       stickRight = 1;
-                       if (this.ballX < 0) {
-                               this.ballX = 0;
-                       }
-               }
-
-               if (this.ballY < 0) {
-                       this.ballY = 0;
-                       this.dY = Math.abs(this.dY) * this.friction - this.frictionC;
-                       this.dX *= this.sideFriction;
-                       stickTop = 1;
-               } else if ((this.ballY + this.ballHeight) > this.gameHeight) {
-                       this.ballY = this.gameHeight - this.ballHeight;
-                       this.dY = -Math.abs(this.dY) * this.friction + this.frictionC;
-                       this.dX *= this.sideFriction;
-                       stickBottom = 1;
-                       if (this.ballY < 0) {
-                               this.ballY = 0;
-                       }
-               }
-
-               isHittingEdge = {
-                       x: (stickLeft || stickRight) && Math.abs(this.dX) > 1,
-                       y: (stickTop || stickBottom) && Math.abs(this.dY) > 1
-               };
-
-               // if on the edge and the hitting speed is high enough
-               if ((shouldVibrate.x && isHittingEdge.x) || (shouldVibrate.y && isHittingEdge.y)) {
-                       if (typeof navigator.webkitVibrate === 'function') {
-                               navigator.webkitVibrate(100);
-                       } else {
-                               navigator.vibrate(100);
-                       }
-               }
-
-               $('.ball').css('left', this.ballX + 'px');
-               $('.ball').css('top', this.ballY + 'px');
-
-               rX = this.ballX - rX;
-               rY = this.ballY - rY;
-
-       },
-
-       /**
-        * Draw the next animation frame
-        */
-       fun: function fun() {
-               "use strict";
-               if (this.event) {
-                       switch (this.current) {
-                       case 'ball':
-                               this.ballEvents();
-                               break;
-                       case 'earth':
-                               this.earthEvents();
-                               break;
-                       case 'baloon':
-                               this.ballEvents();
-                               break;
-                       default:
-                               console.warn("Incorrect current mode");
-                               this.ballEvents();
-                       }
-               }
-
-               // animation - go to next step;
-               if (this.timeout !== null) {
-                       clearTimeout(this.timeout);
-               }
-               this.timeout = setTimeout(this.fun.bind(this), this.animationInterval);
-       },
-
-       /**
-        * Switch to the 'ball' tab
-        */
-       startBall: function startBall() {
-               "use strict";
-
-               $('.ui-content').removeClass('background1 background2 background3').addClass('background1');
-               $(':jqmData(role="controlbar")').find('.ui-btn').removeClass('ui-btn-hover-s ui-btn-down-s');
-               this.gameHeight = $('.background').outerHeight();
-
-               this.cdd = -0.3;
-               this.resistance = 0.98;
-               this.friction = 0.90;
-               this.sideFriction = 0.95;
-               this.frictionC = 0.002;
-
-               this.current = 'ball';
-
-               $('#sun').remove();
-               $('.ball').attr('src', './images/ball1.png');
-               $('.ball').css('width', '86px');
-               $('.ball').css('height', '86px');
-
-               $('.background').css('background-position', '0px -90px');
-
-               this.ballWidth = parseInt($('.ball').css('width'), 10);
-               this.ballHeight = parseInt($('.ball').css('height'), 10);
-       },
-
-       /**
-        * Switch to the 'sky' tab
-        */
-       startSky: function startSky() {
-               "use strict";
-               $('.ui-content').removeClass('background1 background2 background3').addClass('background2');
-               $(':jqmData(role="controlbar")').find('.ui-btn').removeClass('ui-btn-hover-s ui-btn-down-s');
-               this.gameHeight = $('.background').outerHeight();
-
-               this.cdd = 0.05;
-               this.resistance = 0.90;
-               this.friction = 0.98;
-               this.sideFriction = 0.95;
-               this.frictionC = 0.002;
-
-               this.current = 'baloon';
-
-               $('#sun').remove();
-               $('.ball').attr('src', './images/balloon.png');
-               $('.ball').css('width', '100px');
-               $('.ball').css('height', '100px');
-
-               $('.background').css('background-position', '0px -80px');
-
-               this.ballWidth = parseInt($('.ball').css('width'), 10);
-               this.ballHeight = parseInt($('.ball').css('height'), 10);
-       },
-
-       /**
-        * Switch to the 'space' tab
-        */
-       startSpace: function startSpace() {
-               "use strict";
-               var backgroundPosition, arrayPos;
-
-               $('.ui-content').removeClass('background1 background2 background3').addClass('background3');
-               $(':jqmData(role="controlbar")').find('.ui-btn').removeClass('ui-btn-hover-s ui-btn-down-s');
-
-               this.gameHeight = $('.background').outerHeight();
-
-               this.friction = 0.60; // bounce
-               this.sideFriction = 0.95;
-               this.frictionC = 0.0;
-
-               this.current = 'earth';
-
-               $('.ball').attr('src', './images/earth.png');
-               $('#main').append('<img id="sun" class="sun" src="./images/sun.png" style="display: none;"></img>');
-
-               this.sunX = (this.gameWidth - parseInt($('#sun').css('width'), 10)) / 2;
-               this.sunY = (this.gameHeight - parseInt($('#sun').css('height'), 10)) / 2;
-               $('.ball').css('width', '50px');
-               $('.ball').css('height', '50px');
-
-               $('.background').css('background-position', '0px 0px');
-
-               this.ballWidth = parseInt($('.ball').css('width'), 10);
-               this.ballHeight = parseInt($('.ball').css('height'), 10);
-               this.sunWidth = parseInt($('#sun').css('width'), 10);
-               this.sunHeight = parseInt($('#sun').css('height'), 10);
-
-               backgroundPosition = $('.background').css('background-position');
-
-               arrayPos = backgroundPosition.split(' ');
-               this.backgroundTop = parseInt(arrayPos[0], 10);
-               this.backgroundLeft = parseInt(arrayPos[1], 10);
-               this.backgroundWidth = parseInt($('.background').css('width'), 10);
-               this.backgroundHeight = parseInt($('.background').css('height'), 10);
-       },
-
-       saveSensorData: function saveSensorData(event) {
-               "use strict";
-               this.event = event;
-       }
+    sensor: null,
+    R: 2000.0, // gravity constant * m * M
+
+    gameWidth: 0,
+    gameHeight: 0,
+    ballWidth: 0,
+    ballHeight: 0,
+    sunWidth: 0,
+    sunHeight: 0,
+    ballX: 0,
+    ballY: 0,
+    dX: 0,
+    dY: 0,
+    sunX: 0,
+    sunY: 0,
+
+    backgroundWidth: 0,
+    backgroundHeight: 0,
+    backgroundTop: 0,
+    backgroundLeft: 0,
+
+    resistance: 0.98, // air
+    friction: 0.90, // bounce
+    sideFriction: 0.95,
+    frictionC: 0.002,
+    repulse: 0.6,
+    cdd: -0.3,
+
+    timeout: null,
+    current: 'ball',
+    event: null,
+    animationInterval: 40,
+
+    /**
+     * Draw earth background position
+     * @param {int} x current x earth position
+     * @param {int} y current y earth position
+     */
+    earthUpdateBackgroundPosition:
+        function earthUpdateBackgroundPosition(x, y) {
+        'use strict';
+        var rX, rY,
+            cX, cY,
+            tX, tY,
+            bdX, bdY,
+            br;
+
+        rX = -30.0;
+        rY = -30.0;
+
+        cX = (this.gameWidth - this.backgroundWidth) / 2;
+        cY = (this.gameHeight - this.backgroundHeight) / 2;
+
+        tX = cX + (-x * rX);
+        tY = cY + (y * rY);
+
+        bdX = tX - this.backgroundLeft;
+        bdY = tY - this.backgroundTop;
+
+        br = 0.2;
+
+        this.backgroundLeft += bdX * br;
+        this.backgroundTop += bdY * br;
+
+        $('.background').css('background-position', (this.backgroundLeft - 330)
+            + 'px ' + (this.backgroundTop - 330) + 'px');
+    },
+
+    /**
+     * Draw sun position
+     * @param {int} x current x earth position
+     * @param {int} y current y earth position
+     */
+    earthUpdateSunPosition: function earthUpdateSunPosition(x, y) {
+        'use strict';
+
+        var rX, rY,
+            cX, cY,
+            tX, tY,
+            bdX, bdY,
+            br;
+
+        rX = -8.0;
+        rY = -8.0;
+
+        cX = (this.gameWidth - this.sunWidth) / 2;
+        cY = (this.gameHeight - this.sunHeight) / 2;
+
+        tX = cX + (-x * rX);
+        tY = cY + (y * rY);
+
+        bdX = tX - this.sunX;
+        bdY = tY - this.sunY;
+
+        br = 0.2;
+
+        this.sunX += bdX * br;
+        this.sunY += bdY * br;
+
+        $('#sun').css('left', this.sunX + 'px');
+        $('#sun').css('top', this.sunY + 'px');
+        $('#sun').show();
+    },
+
+    /**
+     * Deceleration - used when the earth leaves the Sun's gravitation
+     */
+    deceleration: function deceleration() {
+        'use strict';
+
+        this.dX *= 0.6;
+        this.dY *= 0.6;
+    },
+
+    /**
+     * Draw the next animation frame for the 'earth' tab
+     */
+    earthEvents: function earthEvents() {
+        'use strict';
+
+        var event, borderTolerance,
+            x, y,
+            dXl, dYl,
+            d,
+            d2,
+            ddx, ddy,
+            ratio;
+
+        event = this.event;
+        borderTolerance = 30; // when Earth reach a border,
+                              // then Earth is "moving"
+
+        x = -event.accelerationIncludingGravity.x;
+        y = -event.accelerationIncludingGravity.y;
+
+        // calculate X and Y distances between the Sun and Earth
+        dXl = (this.sunX + this.sunWidth / 2
+            - (this.ballX + (this.ballWidth / 2))); // x distance
+        dYl = (this.sunY + this.sunHeight / 2
+            - (this.ballY + (this.ballHeight / 2))); // y distance
+
+        if (Math.abs(dXl) < 1) {
+            dXl = dXl < 0 ? -1 : 1; // round to 1 * sign
+        }
+        if (Math.abs(dYl) < 1) {
+            dYl = dYl < 0 ? -1 : 1; // round to 1 * sign
+        }
+
+        // distance squared
+        d2 = Math.pow(dXl, 2) + Math.pow(dYl, 2);
+        // distance
+        d = Math.sqrt(d2);
+
+        // acceleration is proportional to 1/d2 [a=GM/r^2]
+        // X component is also proportional to dXl / d
+        ddx = (this.R * dXl) / (d2 * d);
+        ddy = (this.R * dYl) / (d2 * d);
+
+        // apply acceleration to speed
+        this.dX += ddx;
+        this.dY += ddy;
+        // max speed
+        ratio = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2)) / 25;
+        if (ratio > 1) { // speed limit achieved
+            this.dX /= ratio;
+            this.dY /= ratio;
+        }
+
+        // apply speed to Earth position
+        this.ballX += this.dX;
+        this.ballY += this.dY;
+
+        // What do it when the earth leaves gravitation of the Sun?;
+        if (this.ballX > (this.gameWidth + borderTolerance)) {
+            this.ballX = -borderTolerance; this.deceleration();
+        }
+        if (this.ballY > (this.gameHeight + borderTolerance)) {
+            this.ballY = -borderTolerance; this.deceleration();
+        }
+        if (this.ballX < -borderTolerance) {
+            this.ballX = this.gameWidth + borderTolerance; this.deceleration();
+        }
+        if (this.ballY < -borderTolerance) {
+            this.ballY = this.gameHeight + borderTolerance; this.deceleration();
+        }
+
+        // update Earth position
+        $('.ball').css('left', this.ballX + 'px');
+        $('.ball').css('top', this.ballY + 'px');
+
+        // relative depth Sun / Earth
+        if (this.dY > 0) {
+            $('.ball').css('z-index', 100);
+        } else {
+            $('.ball').css('z-index', 20);
+        }
+
+        this.earthUpdateBackgroundPosition(x, y);
+        this.earthUpdateSunPosition(x, y);
+    },
+
+    /**
+     *  Checks if the ball already was on the edge in the previous step
+     *
+     *  If so, this is not a 'real' bounce - the ball is just laying on the edge
+     *  Uses globals: ballX, ballY, ballWidth, ballHeight, gameWidth, gameHeight
+     *
+     *  @return {Object}
+     */
+    shouldVibrateIfHitsEdge: function shouldVibrateIfHitsEdge() {
+        'use strict';
+
+        var ret = {
+            x: true,
+            y: true
+        };
+
+        if (this.ballX <= 0) {
+            ret.x = false;
+        } else if ((this.ballX + this.ballWidth) >= this.gameWidth) {
+            ret.x = false;
+        }
+        if (this.ballY <= 0) {
+            ret.y = false;
+        } else if ((this.ballY + this.ballHeight) >= this.gameHeight) {
+            ret.y = false;
+        }
+
+        return ret;
+    },
+
+    /**
+     * Draw the next animation frame for the 'ball' tab
+     */
+    ballEvents: function ballEvents() {
+        'use strict';
+
+        var event,
+            x,
+            y,
+            stickTop = 0,
+            stickLeft = 0,
+            stickBottom = 0,
+            stickRight = 0,
+            rX,
+            rY,
+            ddx,
+            ddy,
+            shouldVibrate = null,
+            isHittingEdge = null;
+
+        event = this.event;
+
+        x = -event.accelerationIncludingGravity.x;
+        y = -event.accelerationIncludingGravity.y;
+
+        stickTop = 0;
+        stickLeft = 0;
+        stickBottom = 0;
+        stickRight = 0;
+
+        rX = this.ballX;
+        rY = this.ballY;
+        ddx = x * -this.cdd;
+        ddy = y * this.cdd;
+        this.dX += ddx;
+        this.dY += ddy;
+        this.dX *= this.resistance;
+        this.dY *= this.resistance;
+
+        shouldVibrate = this.shouldVibrateIfHitsEdge();
+
+        this.ballX += this.dX;
+        this.ballY += this.dY;
+
+        if (this.ballX < 0) {
+            this.ballX = 0;
+            this.dX = Math.abs(this.dX) * this.friction - this.frictionC;
+            this.dY *= this.sideFriction;
+            stickLeft = 1;
+        } else if ((this.ballX + this.ballWidth) > this.gameWidth) {
+            this.ballX = this.gameWidth - this.ballWidth;
+            this.dX = -Math.abs(this.dX) * this.friction + this.frictionC;
+            this.dY *= this.sideFriction;
+            stickRight = 1;
+            if (this.ballX < 0) {
+                this.ballX = 0;
+            }
+        }
+
+        if (this.ballY < 0) {
+            this.ballY = 0;
+            this.dY = Math.abs(this.dY) * this.friction - this.frictionC;
+            this.dX *= this.sideFriction;
+            stickTop = 1;
+        } else if ((this.ballY + this.ballHeight) > this.gameHeight) {
+            this.ballY = this.gameHeight - this.ballHeight;
+            this.dY = -Math.abs(this.dY) * this.friction + this.frictionC;
+            this.dX *= this.sideFriction;
+            stickBottom = 1;
+            if (this.ballY < 0) {
+                this.ballY = 0;
+            }
+        }
+
+        isHittingEdge = {
+            x: (stickLeft || stickRight) && Math.abs(this.dX) > 1,
+            y: (stickTop || stickBottom) && Math.abs(this.dY) > 1
+        };
+
+        // if on the edge and the hitting speed is high enough
+        if ((shouldVibrate.x && isHittingEdge.x) || (shouldVibrate.y
+            && isHittingEdge.y)) {
+            if (typeof navigator.webkitVibrate === 'function') {
+                navigator.webkitVibrate(100);
+            } else {
+                navigator.vibrate(100);
+            }
+        }
+
+        $('.ball').css('left', this.ballX + 'px');
+        $('.ball').css('top', this.ballY + 'px');
+
+        rX = this.ballX - rX;
+        rY = this.ballY - rY;
+
+    },
+
+    /**
+     * Draw the next animation frame
+     */
+    fun: function fun() {
+        'use strict';
+
+        if (this.event) {
+            switch (this.current) {
+            case 'ball':
+                this.ballEvents();
+                break;
+            case 'earth':
+                this.earthEvents();
+                break;
+            case 'baloon':
+                this.ballEvents();
+                break;
+            default:
+                console.warn('Incorrect current mode');
+                this.ballEvents();
+            }
+        }
+
+        // animation - go to next step;
+        if (this.timeout !== null) {
+            clearTimeout(this.timeout);
+        }
+        this.timeout = setTimeout(this.fun.bind(this), this.animationInterval);
+    },
+
+    /**
+     * Switch to the 'ball' tab
+     */
+    startBall: function startBall() {
+        'use strict';
+
+        $('.ui-content').removeClass('background1 background2 background3')
+            .addClass('background1');
+        $(':jqmData(role="controlbar")').find('.ui-btn')
+            .removeClass('ui-btn-hover-s ui-btn-down-s');
+        this.gameHeight = $('.background').outerHeight();
+
+        this.cdd = -0.3;
+        this.resistance = 0.98;
+        this.friction = 0.90;
+        this.sideFriction = 0.95;
+        this.frictionC = 0.002;
+
+        this.current = 'ball';
+
+        $('#sun').remove();
+        $('.ball').attr('src', './images/ball1.png');
+        $('.ball').css('width', '86px');
+        $('.ball').css('height', '86px');
+
+        $('.background').css('background-position', '0px -90px');
+
+        this.ballWidth = parseInt($('.ball').css('width'), 10);
+        this.ballHeight = parseInt($('.ball').css('height'), 10);
+    },
+
+    /**
+     * Switch to the 'sky' tab
+     */
+    startSky: function startSky() {
+        'use strict';
+
+        $('.ui-content').removeClass('background1 background2 background3')
+            .addClass('background2');
+        $(':jqmData(role="controlbar")').find('.ui-btn')
+            .removeClass('ui-btn-hover-s ui-btn-down-s');
+        this.gameHeight = $('.background').outerHeight();
+
+        this.cdd = 0.05;
+        this.resistance = 0.90;
+        this.friction = 0.98;
+        this.sideFriction = 0.95;
+        this.frictionC = 0.002;
+
+        this.current = 'baloon';
+
+        $('#sun').remove();
+        $('.ball').attr('src', './images/balloon.png');
+        $('.ball').css('width', '100px');
+        $('.ball').css('height', '100px');
+
+        $('.background').css('background-position', '0px -80px');
+
+        this.ballWidth = parseInt($('.ball').css('width'), 10);
+        this.ballHeight = parseInt($('.ball').css('height'), 10);
+    },
+
+    /**
+     * Switch to the 'space' tab
+     */
+    startSpace: function startSpace() {
+        'use strict';
+
+        var backgroundPosition, arrayPos;
+
+        $('.ui-content').removeClass('background1 background2 background3')
+            .addClass('background3');
+        $(':jqmData(role="controlbar")').find('.ui-btn')
+            .removeClass('ui-btn-hover-s ui-btn-down-s');
+
+        this.gameHeight = $('.background').outerHeight();
+
+        this.friction = 0.60; // bounce
+        this.sideFriction = 0.95;
+        this.frictionC = 0.0;
+
+        this.current = 'earth';
+
+        $('.ball').attr('src', './images/earth.png');
+        $('#main').append('<img id="sun" class="sun" src="./images/sun.png"'
+                + ' style="display: none;"></img>');
+
+        this.sunX = (this.gameWidth - parseInt($('#sun').css('width'), 10)) / 2;
+        this.sunY = (this.gameHeight
+            - parseInt($('#sun').css('height'), 10)) / 2;
+        $('.ball').css('width', '50px');
+        $('.ball').css('height', '50px');
+
+        $('.background').css('background-position', '0px 0px');
+
+        this.ballWidth = parseInt($('.ball').css('width'), 10);
+        this.ballHeight = parseInt($('.ball').css('height'), 10);
+        this.sunWidth = parseInt($('#sun').css('width'), 10);
+        this.sunHeight = parseInt($('#sun').css('height'), 10);
+
+        backgroundPosition = $('.background').css('background-position');
+
+        arrayPos = backgroundPosition.split(' ');
+        this.backgroundTop = parseInt(arrayPos[0], 10);
+        this.backgroundLeft = parseInt(arrayPos[1], 10);
+        this.backgroundWidth = parseInt($('.background').css('width'), 10);
+        this.backgroundHeight = parseInt($('.background').css('height'), 10);
+    },
+
+    saveSensorData: function saveSensorData(event) {
+        'use strict';
+
+        this.event = event;
+    }
+
 };
 
 $(document).ready(function () {
-       "use strict";
-       var img,
-               contentHeight = screen.availHeight - $('div[data-role="header"]').outerHeight() - $('div[data-role="footer"]').outerHeight();
-
-       $('div[data-role="content"]').css('height', contentHeight - 33);
-       app.gameWidth = screen.availWidth;
-       app.ballWidth = parseInt($('.ball').css('width'), 10);
-       app.ballHeight = parseInt($('.ball').css('height'), 10);
-
-       window.addEventListener('devicemotion', app.saveSensorData.bind(app), false);
-
-       app.fun();
-
-       $(window).on('tizenhwkey', function (e) {
-               if (e.originalEvent.keyName === "back") {
-                       tizen.application.getCurrentApplication().exit();
-               }
-       });
-
-       $('#btnBall').bind('click', function (event) {
-               preventSecClick(this);
-               app.startBall();
-       });
-
-       $('#btnSky').bind('click', function (event) {
-               preventSecClick(this);
-               app.startSky();
-       });
-
-       $('#btnSpace').bind('click', function () {
-               preventSecClick(this);
-               app.startSpace();
-       });
-
-       function preventSecClick(current) {
-               $('#sun').remove();
-               $("#footerControls li a.ui-disabled").removeClass('ui-disabled');
-               $(current).addClass("ui-disabled");
-       }
-
-       $('#mainPage').on('pageshow', function () {
-               app.startBall();
-       });
-
-       document.addEventListener('webkitvisibilitychange', function (event) {
-               if (document.webkitVisibilityState === 'visible') {
-                       app.fun();
-               }
-       });
-
-       // Preload backgrounds;
-       img = $('<img>').hide();
-       img.attr('src', 'images/background1.png');
+    'use strict';
+
+    var img,
+        contentHeight = screen.availHeight
+            - $('div[data-role="header"]').outerHeight()
+            - $('div[data-role="footer"]').outerHeight();
+
+    $('div[data-role="content"]').css('height', contentHeight);
+    app.gameWidth = screen.availWidth;
+    app.ballWidth = parseInt($('.ball').css('width'), 10);
+    app.ballHeight = parseInt($('.ball').css('height'), 10);
+
+    window
+        .addEventListener('devicemotion', app.saveSensorData.bind(app), false);
+
+    app.fun();
+
+    $(window).on('tizenhwkey', function (e) {
+        if (e.originalEvent.keyName === 'back') {
+            tizen.application.getCurrentApplication().exit();
+        }
+    });
+
+    function preventSecClick(current) {
+        $('#sun').remove();
+        $('#footerControls li a.ui-disabled').removeClass('ui-disabled')
+            .attr('tabIndex', '0');
+        $(current).addClass('ui-disabled').blur().attr('tabIndex', '-1');
+    }
+
+    $('#btnBall').bind('click', function (event) {
+        preventSecClick(this);
+        app.startBall();
+    });
+
+    $('#btnSky').bind('click', function (event) {
+        preventSecClick(this);
+        app.startSky();
+    });
+
+    $('#btnSpace').bind('click', function (event) {
+        preventSecClick(this);
+        app.startSpace();
+    });
+
+    $('#mainPage').on('pageshow', function () {
+        $('#btnBall').trigger('click');
+        app.startBall();
+    });
+
+    document.addEventListener('webkitvisibilitychange', function (event) {
+        if (document.webkitVisibilityState === 'visible') {
+            app.fun();
+        }
+    });
+
+    // Preload backgrounds;
+    img = $('<img>').hide();
+    img.attr('src', 'images/background1.png');
 });
 
 $(window).resize(function () {
-       'use strict';
-       app.gameWidth = screen.availWidth;
-       app.gameHeight = $('.background').outerHeight();
+    'use strict';
+    app.gameWidth = screen.availWidth;
+    app.gameHeight = $('.background').outerHeight();
 });