function RocketStarGame()
{
  var instance = this;
  var pathX= 500;
  var pathY= 180;

  var burstv = 7;
  var normv = 2;

  var friction = 0.98;
  var px = 0;
  var py = 0;
  var ax = 0;
  var ay = 0;
  var vx = 0;
  var vy = 0;
  var maxvx = normv;
  var maxvy = 100;
  var maxy = 180;
  var miny = -180;

  var points = 0;
  var seconds = 90;
  var distance = 0;

  var enemyType = 0;

  var enemies = [];
  var enemyBank = [];
  var starBank = [];
  var bgList = [];

  var orientation;

  var GAME_TIMER;
  var GAME_SECONDS;

  $('#rs_game').ready(rocketstar_ready);

  function rocketstar_ready()
  {
    updateOrientation();
    $(window).keydown(handle_window_KEYDOWN);
    $(window).keydown(handle_window_KEYUP);
    window.addEventListener("orientationchange", handle_window_ORIENTATION, false);
    window.addEventListener("devicemotion", handle_window_MOTION, false);
    GAME_TIMER = setInterval(handle_game_TIMER, 1);
    GAME_SECONDS = setInterval(handle_game_SECONDS, 1000);
    $('#rs_time').html(seconds);
  }

  this.init = function()
  {
    $('.rs_star').each(function(){
      starBank.push(this);
    });
    $('.rs_enemy').each(function(){
      enemyBank.push(this);
    });
    $('.rs_bg').each(function(){
      bgList.push(this);
    });

    var bgholder = document.getElementById('rs_bg_holder');
    bgholder.style.webkitTransform = "translate3d(0px, 0px, 0px)";
    bgholder.style.MozTransform = "translate(0px, 0px)";

    for (var j = 0; j < bgList.length; j++) {
       $(bgList[j]).css({
        "webkitTransform": "translate3d("+(j*1000)+"px, 0px, 0px)",
        "MozTransform": "translate("+(j*1000)+"px, 0px)"});
    };

    for (var i = 0; i < starBank.length; i++) {
      starBank[i].style.backgroundImage = "url(images/rs/star.png)";
      starBank[i].style.webkitTransform = 'translate3d('+pathX+'px, '+pathY+'px, 0px)';
      starBank[i].style.MozTransform = 'translate('+pathX+'px, '+pathY+'px)';
      starBank[i].arrow = false;
      pathX+=150;
      pathY+= 50*(1-Math.random()*2);
      if(pathY<10){pathY=10};
      if(pathY>300){pathY=300};
    };
  };

  function reset() {
    points = 0;
    seconds = 90;
    distance = 0;
    enemies = [];
    enemyBank = [];
    starBank = [];
    bgList = [];
    px = 0;
    vx = 0;
    pathX = 500;
    pathY = 180;
    instance.init();
    GAME_TIMER = setInterval(handle_game_TIMER, 1);
    GAME_SECONDS = setInterval(handle_game_SECONDS, 1000);
    $('#rs_time').html(seconds);
  }

  function handle_game_SECONDS()
  {
    seconds--;
    $('#rs_time').html(seconds);
    if(seconds===0){
        clearInterval(GAME_SECONDS);
        clearInterval(GAME_TIMER);
        $('#rs_finaldistance').html(distance+"M");
        $('#rs_finalstars').html(points);
        $('#rs_finalscreen').css({'opacity':'.8'});

        $('#rs_finalscreen').bind("click", function(){
          $('#rs_finalscreen').css({'opacity':'0'});
          $('#rs_finalscreen').unbind("click");
          reset();
        }, false);
    }
  }

  function handle_game_TIMER()
  {
    //velocity y
    py+=vy;
    vy = (vy<0||vy>0) ? vy*friction : vy;                     //friction
    vy = py>maxy||py<miny ? vy*-0.3 : vy;
    py = py>maxy ? py-10 : py;
    py = py<miny ? py+10 : py;

    //velocity x
    maxvx = maxvx > normv ? maxvx-0.01 : normv;
    vx = vx>-maxvx ? vx-0.05 : -maxvx;

    starLoop();
    enemyLoop();

    px = px-vx;                                               //velocity
    //px = (vx>0) ? px+vx : px;

    $('#rs_player').css({
      "webkitTransform": "rotate(90deg) translate3d("+py+"px, 0px, 0px)",
      "MozTransform": "rotate(90deg) translate("+py+"px, 0px)"
    });
    $('#rs_scroll').css({
      "webkitTransform": "translate3d("+-px+"px, 0px, 0px)",
      "MozTransform": "translate("+-px+"px, 0px)"
    });

    bgLoop();

    distance = Math.round(px/10);

    $('#rs_points').html("x"+points);
    $('#rs_distance').html(distance+"m");

    if((distance%100==0)&&(enemies.length<1))
    {
      enemyType++;
      if(enemyType%3==0){
				addTri();
			}else if(enemyType%2==0){
				addRect();
			}else{
				addMeteor();
			}
    }
  };

  function addMeteor()
  {
      var enemy = enemyBank[0];
      enemy.animate = function(){};
      $(enemy).removeClass('rs_triangle');
      $(enemy).removeClass('rs_circle');
      $(enemy).removeClass('rs_square');
      $(enemy).addClass('rs_circle');
      $(enemy).css({
        "opacity": "1",
        "webkitTransform": "translate3d("+(px+1000)+"px, "+(py+190)+"px, 0px)",
        "MozTransform": "translate("+(px+1000)+"px, "+(py+190)+"px)"
      });
      enemies.push(enemy);
      enemyBank.splice(0, 1);
  }

  function addTri()
  {
      var enemy = enemyBank[0];
      enemy.x = pathX;
      enemy.y = pathY;
      var n = 0;
      enemy.animate = function()
      {
        n+=.01;
        var newY = this.y+Math.sin(n)*100;
        var newX = this.x+Math.cos(n)*100;
        $(enemy).css({
          "webkitTransform": "translate3d("+newX+"px, "+newY+"px, 0px)",
          "MozTransform": "translate("+newX+"px, "+newY+"px)"
        });
      };
      $(enemy).removeClass('rs_triangle');
      $(enemy).removeClass('rs_circle');
      $(enemy).removeClass('rs_square');
      $(enemy).addClass('rs_triangle');
      $(enemy).css({
        "opacity": "1",
        "webkitTransform": "translate3d("+(px+1000)+"px, 100px, 0px)",
        "MozTransform": "translate("+(px+1000)+"px, 100px)"
      });
      enemies.push(enemy);
      enemyBank.splice(0, 1);
  }

  function addRect()
  {
      var enemy = enemyBank[0];
      enemy.x = pathX;
      enemy.y = pathY;

      var n = 0;
      enemy.animate = function(){
        n+=.01;
        var newY = this.y+Math.sin(n)*100;
        $(enemy).css({
          "webkitTransform": "translate3d("+this.x+"px, "+newY+"px, 0px)",
          "MozTransform": "translate("+this.x+"px, "+newY+"px)"
        });
      }
      $(enemy).removeClass('rs_triangle');
      $(enemy).removeClass('rs_circle');
      $(enemy).removeClass('rs_square');
      $(enemy).addClass('rs_square');
      $(enemy).css({
        "opacity": "1",
        "webkitTransform": "translate3d("+(px+1000)+"px, 100px, 0px)",
        "MozTransform": "translate("+(px+1000)+"px, 100px)"
      });
      enemies.push(enemy);
      enemyBank.splice(0, 1);
  }

  function bgLoop()
  {
    var bgholder = document.getElementById('rs_bg_holder');
    var bgT;
    if(bgholder.style.webkitTransform){
      bgT = wkArray(bgholder.style.webkitTransform);
    }else{
      bgT = mozArray(bgholder.style.MozTransform);
    }

    var bgX = parseInt(bgT[0]);
    var newX = (bgX+vx);
    if(bgX<-1000){
       newX = bgX+1000;
    }
    $('#rs_bg_holder').css({
      "webkitTransform": "translate3d("+newX+"px, 0px, 0px)",
      "MozTransform": "translate("+newX+"px, 0px)"
    });
  }

  function enemyLoop()
  {
    for (var i = 0; i < enemies.length; i++) {
      var enemT;
      if(enemies[i].style.webkitTransform){
        enemT = wkArray(enemies[i].style.webkitTransform);
      }else{
        enemT = mozArray(enemies[i].style.MozTransform);
      }
      var enemX = parseInt(enemT[0]);
      var enemY = parseInt(enemT[1]);
      var relativeX = enemX-px;

      //todo animate characters
      enemies[i].animate();

      if(
        relativeX<465
        &&relativeX>440
        &&enemY<(py+200)
        &&enemY>(py+150)
        &&enemies[i].style.opacity != "0"
      ){
        points = 0;
        vx = 0;
        enemies[i].style.opacity = "0";
      }

      if(relativeX<0)
      {
        pathY+= 50*(1-Math.random()*2);
        if(pathY<10){pathY=10};
        if(pathY>300){pathY=300};
        enemies[i].style.opacity = "0";
        enemyBank.push(enemies[i]);
        enemies.splice(i, 1);
      }
    };
  }

  function starLoop()
  {
    for (var i = 0; i < starBank.length; i++) {
      var starT;
      if(starBank[i].style.webkitTransform){
        starT = wkArray(starBank[i].style.webkitTransform);
      }else{
        starT = mozArray(starBank[i].style.MozTransform);
      }
      var starX = parseInt(starT[0]);
      var starY = parseInt(starT[1]);
      var relativeX = starX-px;

      if(
        relativeX<465
        &&relativeX>440
        &&starY<(py+200)
        &&starY>(py+150)
        &&starBank[i].style.opacity != "0"
      ){
        if(starBank[i].arrow===true){
          maxvx = burstv;
          console.log(maxvx);
        }else{
          points++;
        }
        starBank[i].style.opacity = "0";
      }

      if(relativeX<0)
      {
        if(pathX%500==0){
          //is arrow
          starBank[i].arrow = true;
          starBank[i].style.backgroundImage = "url(images/rs/speed_burst.png)";
        }else{
          //is star
          starBank[i].arrow = false;
          starBank[i].style.backgroundImage = "url(images/rs/star.png)";
        }
        //add new star
        pathY+= 50*(1-Math.random()*2);
        if(pathY<50){pathY=50};
        if(pathY>250){pathY=250};
        starBank[i].style.opacity = "1";
        if(starBank[i].arrow===true){
          starBank[i].style.webkitTransform = "translate3d("+pathX+"px, "+pathY+"px, 0px) rotateZ(90deg)";
          starBank[i].style.MozTransform = "translate("+pathX+"px, "+pathY+"px) rotate(90deg)";
        }else{
          starBank[i].style.webkitTransform = "translate3d("+pathX+"px, "+pathY+"px, 0px) rotateZ(90deg)";
          starBank[i].style.MozTransform = "translate("+pathX+"px, "+pathY+"px) rotate(90deg)";
        }
        pathX+=150;
      }
    };
  };

  function updateOrientation()
  {
    switch(window.orientation){
        case 0:
          orientation = "portrait";
          break;
        case -90:
           orientation = "right";
          break;
        case 90:
           orientation = "left";
          break;
      }
  }

  function handle_window_ORIENTATION(event)
  {
    updateOrientation();
  }

  function handle_window_MOTION(event)
  {
    var accelerationX = event.accelerationIncludingGravity.x;
    var accelerationY = event.accelerationIncludingGravity.y;
    var accelerationZ = event.accelerationIncludingGravity.z;

    accelerationY +=5;
    accelerationX +=5;

    switch(orientation) {
      case 'portrait':
        vy = -(accelerationY);
        break;
      case 'left':
         vy = -(accelerationX);
        break;
      case 'right':
         vy = (accelerationX);
        break;
      default:
        vy = -(accelerationY);
        break;
    }
  }

  function handle_window_KEYDOWN(event)
  {
    event.preventDefault();

    switch(event.keyCode) {
      case 37:
        vx-=.1;
        break;
      case 38:
        vy=-1;
        break;
      case 39:
        vx+=.1;
        break;
      case 40:
        vy=1;
        break;
      default:
        break;
    }
  }

  function handle_window_KEYUP(event)
  {
  }

  function wkArray(tstring)
  {
    var tstringClean = tstring.replace(/translate3d\(/g, "").replace(/px/g, "").replace(")", "");
    var tarray = tstringClean.split(",");
    return tarray;
  }

  function mozArray(tstring)
  {
    var tstringClean = tstring.replace(/translate\(/g, "").replace(/px/g, "").replace(")", "");
    var tarray = tstringClean.split(",");
    return tarray;
  }
}



