var $j = jQuery.noConflict();

var RS = {
  albumsapp: {
    createWorld: function() {
    var worldAABB = new b2AABB();
    worldAABB.minVertex.Set(-1000, -1000);
    worldAABB.maxVertex.Set(2000, 2000);
    var gravity = new b2Vec2(0, 0);
    var doSleep = true;
    RS.albumsapp.world = new b2World(worldAABB, gravity, doSleep);
    },	        
    createBox: function (world, x, y, width, height, fixed) {
      if (typeof(fixed) == 'undefined') fixed = true;
      var boxSd = new b2BoxDef();
    	if (!fixed) boxSd.density = 0.1;
    	boxSd.extents.Set(width, height);
    	var boxBd = new b2BodyDef();
    	boxBd.AddShape(boxSd);
    	boxBd.position.Set(x,y);
      boxBd.linearDamping = 0.04;
      boxBd.angularDamping = 0.02;              
    	return RS.albumsapp.world.CreateBody(boxBd);
  },
  createAlbum: function() {
      var album = document.createElement('div');
      album.className = 'square';
      album.innerHTML = "<div class='cover'></div><div class='artwork'></div><div class='inlay'></div>";
      var container = RS.albumsapp.physicsContainer;
      container.appendChild(album);
      var width = parseInt($j(album).css('width'));
      var height = parseInt($j(album).css('height'));
      var containerWidth = parseInt($j(container).css('width'));
      var x = (Math.random() * containerWidth) - (width/2);
      var y = 0 - 2*(height/3);
      album.radians = Math.random()*Math.PI;
      album.body = RS.albumsapp.createBox(RS.albumsapp.world, x, y, width/2, height/2, false);
      $j(album).mousedown(RS.albumsapp.startDrag);
      $j(album).css('left', x);
      $j(album).css('top', y);
      $j(album).css('display', 'block');
      RS.albumsapp.squares.push(album);
      return album;
  },
  step: function() {
    var iteration = 1;
    RS.albumsapp.world.Step(RS.albumsapp.fps, iteration);
    
    var container = RS.albumsapp.physicsContainer;
    var containerWidth = parseInt($j(container).css('width'));
    var containerHeight = parseInt($j(container).css('height'));
    
    for (var i=0; i < RS.albumsapp.squares.length; i++) {
      var square = RS.albumsapp.squares[i];
        if (square != undefined) {
        square.radians = square.body.GetRotation();
        square.position = square.body.GetOriginPosition();

        var width = parseInt($j(square).css('width'));
        var height = parseInt($j(square).css('height'));

        if ((square.position.x + width) < 0 
          || square.position.x > containerWidth
          || (square.position.y + height) < 0
          || square.position.y > containerHeight + (height/2)
          ) {
          RS.albumsapp.world.DestroyBody(square.body);
          square.parentNode.removeChild(square);
          window.setTimeout(RS.albumsapp.enqueueNewAlbum, 1*1000);
          RS.albumsapp.squares[i] = undefined;
        }

        $j(square).css('left', square.position.x);
        $j(square).css('top', square.position.y);
      
        $j(square).css({
          "-moz-transform" : "rotate("+ square.radians +"rad)", 
          "-webkit-transform" : "rotate("+ square.radians +"rad)"
        });                                
      }              
    };            
  },
  startDrag: function(event){
    var x = event.pageX - RS.albumsapp.physicsContainer.offsetLeft;
    var y = event.pageY - RS.albumsapp.physicsContainer.offsetTop;

    var mouseJointDef = new b2MouseJointDef();
    mouseJointDef.body1 = RS.albumsapp.world.GetGroundBody();
    mouseJointDef.body2 = this.body;
    var offset = this.body.GetLocalPoint(new b2Vec2(x, y));
    mouseJointDef.target.Set(x-offset.x, y-offset.y);
    RS.albumsapp.mousedownoffset = offset;          
    mouseJointDef.maxForce = 40000.0 * this.body.GetMass();
    mouseJointDef.timeStep = RS.albumsapp.fps;
    // mouseJointDef.dampingRatio = 1;
  
    RS.albumsapp.mousejoint = RS.albumsapp.world.CreateJoint(mouseJointDef);
    },
  cancelDrag: function() {
    if (null !== RS.albumsapp.mousejoint) {
      RS.albumsapp.world.DestroyJoint(RS.albumsapp.mousejoint);
      RS.albumsapp.mousejoint = null;
    }
    if (null !== RS.albumsapp.mousebody) {
      RS.albumsapp.world.DestroyBody(RS.albumsapp.mousebody);
      RS.albumsapp.mousebody = null;
    }            
  },
  stopTicker: function() {
    window.clearTimeout(RS.albumsapp.ticker);
  },
  enqueueNewAlbum: function() {
    RS.albumsapp.enqueueNewAlbums(1);
  },
  enqueueNewAlbums: function(count) {
    RS.albumsapp.enqueuedAlbums += count;
    if (RS.albumsapp.enqueuedAlbums > RS.albumsapp.maxEnqueuedAlbums) {
        RS.albumsapp.enqueuedAlbums = RS.albumsapp.maxEnqueuedAlbums;
    }
    if (null === RS.albumsapp.enqueuedAlbumsTimer && RS.albumsapp.enqueuedAlbums > 0) {
      RS.albumsapp.insertEnquedAlbum();
    }
  },
  insertEnquedAlbum: function() {            
    var album = RS.albumsapp.createAlbum();
    var impulsePosition = album.body.GetCenterPosition();
    impulsePosition.x += (Math.random() * 50) - 25;
    impulsePosition.y += (Math.random() * 50) - 25;          
    album.body.ApplyImpulse(new b2Vec2(0, 1200000), impulsePosition);
    album.body.ApplyTorque(Math.random() * 10);
    RS.albumsapp.enqueuedAlbumsTimer = null;            
    RS.albumsapp.enqueuedAlbums--;
    
    if (RS.albumsapp.enqueuedAlbums > 0) {
      RS.albumsapp.enqueuedAlbumsTimer = window.setTimeout(RS.albumsapp.insertEnquedAlbum, 1*1000);
    }
  },
  startPhysics: function() {
    RS.albumsapp.createWorld();
    RS.albumsapp.fps = 1/60;
    RS.albumsapp.squares = [];
    RS.albumsapp.physicsContainer = $j('.physics').get(0);
    RS.albumsapp.enqueuedAlbums = 0;
    RS.albumsapp.maxEnqueuedAlbums = 6;    

    RS.albumsapp.enqueuedAlbumsTimer = null;        
    RS.albumsapp.mousejoint = null;
    RS.albumsapp.mousebody = null;        
    RS.albumsapp.lastmousepoint = {x: 0, y: 0};

    RS.albumsapp.newt_shape_weight = 1.0;
    $j('.physics').first().mousemove(function(event){
        if (null != RS.albumsapp.mousejoint) {
          var offset = RS.albumsapp.mousedownoffset;
          var x = event.pageX - this.offsetLeft - offset.x;
          var y = event.pageY - this.offsetTop - offset.y;
          RS.albumsapp.mousejoint.SetTarget(new b2Vec2(x, y));
        }
    });
    $j('.physics').mouseleave(function(event){
      RS.albumsapp.cancelDrag();          
    });
    $j('.physics').mouseup(function(event){
      RS.albumsapp.cancelDrag();
    });        
      $j('div.square').each(function(index){
        this.radians = 0;
        var width = parseInt($j(this).css('width'));
        var height = parseInt($j(this).css('height'));
        var x = parseInt($j(this).css('left'));
        var y = parseInt($j(this).css('top'));	    
        this.body = RS.albumsapp.createBox(RS.albumsapp.world, x, y, width/2, height/2, false);
        RS.albumsapp.squares.push(this);
      });
  
    RS.albumsapp.enqueueNewAlbums(6);
      RS.albumsapp.step();
  	      
    RS.albumsapp.ticker = window.setInterval(RS.albumsapp.step, RS.albumsapp.fps*1000);      
  }
  }
};

$j(document).ready(function() {
    $j('div#screenshots a').fancyZoom({scaleImg: true, directory: 'img/fancyzoom/', closeOnClick: true});

    if ($j.browser.webkit || ($j.browser.mozilla && parseFloat($j.browser.version) >= 1.9)) {
        $j.getScript('js/box2d.min.js', function() {
            RS.albumsapp.startPhysics();
        });        
    }
    // window.setTimeout(RS.albumsapp.stopTicker, 1000*60);
});	
