client/js/tweetvote-anim.js
author Romain <romain.vuillemot@gmail.com>
Tue, 21 Feb 2012 11:10:12 +0100
changeset 11 ef4287a73c4a
parent 9 fd659ad76e0f
child 12 a7b169ba0172
permissions -rwxr-xr-x
fixed ball width

var canvas;
var tooltipOpen=true;
var Width  = 960;
var Height = 400;
var delta = [0, 0];
var stage = [195, 250, 1150, 835]   //     bottom
var b2bod = [];

var BALL_SIZE = 40;
              
var worldAABB, world, iterations = 1, timeStep = 1 / 20;

var walls = [];
var wall_thickness = 10;
var wallsSetted = false;

var bodies, elements, text;

var createMode = false;
var destroyMode = false;

var emptyBottom = true;

var isFreezing = false;
var refLoop, refFileAttente;

var isMouseDown = false;
var isMouseDragging = false;
var isMouseDragging2 = true;
var mouseJoint;
var mouse = { x: 0, y: 0 };
var gravity = { x: 0, y: 0.3 };

var PI2 = Math.PI * 2;

var timeOfLastTouch = 0;
var tweetSilos = [];

init();
play();
/*
listLastTweets();
getInitialTweets();
TweetAnim.shiftQueue();
*/
function init() {

	worldAABB = new b2AABB();
	worldAABB.minVertex.Set( -200, -200 );
	worldAABB.maxVertex.Set( window.innerWidth + 200, window.innerHeight + 200 );

	world = new b2World( worldAABB, new b2Vec2( 0, 0 ), true );

	setWalls();
	reset();
}


function play() {

  if(!isFreezing)
    refLoop = setInterval( loop, 1000 / 40 );
 else
    clearInterval(refLoop);
    
  isFreezing = !isFreezing;
}

function reset() {

	if(bodies) {
		for (var i= 0; i < bodies.length; i++ ) {
			var body = bodies[ i ]
			canvas.removeChild( body.GetUserData().element );
			world.DestroyBody( body );
			body = null;
		}
	}
	bodies = [];
	elements = [];
}

function onDocumentMouseDown() {
  isMouseDragging = false;
	isMouseDown = true;
	return false;
}

function onDocumentMouseUp() {
	isMouseDown = false;
	return false;
}

function onDocumentMouseMove( event ) {

  if(isMouseDown)
    isMouseDragging = true;
	mouse.x = event.clientX;
	mouse.y = event.clientY;
	
}

function onDocumentTouchStart( event ) {

		

	if( event.touches.length == 1 ) {

		event.preventDefault();

		// Faking double click for touch devices

		var now = new Date().getTime();

		if ( now - timeOfLastTouch  < 250 ) {

			reset();
			return;
		}

		timeOfLastTouch = now;

		mouse.x = event.touches[ 0 ].pageX;
		mouse.y = event.touches[ 0 ].pageY;
		isMouseDown = true;
	}
}

function onDocumentTouchMove( event ) {

	if (event.touches.length == 1) {

		event.preventDefault();
		mouse.x = event.touches[ 0 ].pageX;
		mouse.y = event.touches[ 0 ].pageY;
	}
}

function onDocumentTouchEnd( event ) {

	if (event.touches.length == 0) {
		event.preventDefault();
		isMouseDown = false;
	}
}

function loop() {

	delta[0] += (0 - delta[0]) * .5;
	delta[1] += (0 - delta[1]) * .5;
	world.m_gravity.x = gravity.x * 350 + delta[0];
	world.m_gravity.y = gravity.y * 350 + delta[1];

	mouseDrag();
	world.Step(timeStep, iterations);

	for (i = 0; i < bodies.length; i++) {
		var body = bodies[i];
		var element = elements[i];
		element.style.left = (body.m_position0.x - (element.width >> 1)) + 'px';
		element.style.top = (body.m_position0.y - (element.height >> 1)) + 'px';

		if (element.tagName == 'DIV') {
			var rotationStyle = 'rotate(' + (body.m_rotation0 * 57.2957795) + 'deg)';
			text.style.WebkitTransform = rotationStyle;
			text.style.MozTransform = rotationStyle;
			text.style.OTransform = rotationStyle;
			text.style.msTransform = rotationStyle;
		}
	}
}

function createBox(world, x, y, width, height, fixed) {

var c=document.createElement('canvas');
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(0,0,1500,750);

	if (typeof(fixed) == 'undefined') {
		fixed = true;
	}

	var boxSd = new b2BoxDef();

	if (!fixed) {
		boxSd.density = 1.0;
	}

	boxSd.extents.Set(width, height);
	var boxBd = new b2BodyDef();
	boxBd.AddShape(boxSd);
	boxBd.position.Set(x,y);

  
	return world.CreateBody(boxBd);
}

function mouseDrag()
{
	// mouse press
	if (createMode) {

	} else if (isMouseDown && !mouseJoint) {

		var body = getBodyAtMouse();

		if (body) {
			var md = new b2MouseJointDef();
			md.body1 = world.m_groundBody;
			md.body2 = body;
			md.target.Set(mouse.x, mouse.y);
			md.maxForce = 30000 * body.m_mass;
			md.timeStep = timeStep;
			mouseJoint = world.CreateJoint(md);
			body.WakeUp();
		} else {
			createMode = true;
		}
	}

	if (!isMouseDown) { // mouse release

		createMode = false;
		destroyMode = false;

		if (mouseJoint) {
			world.DestroyJoint(mouseJoint);
			mouseJoint = null;
		}
	}
	
	if (mouseJoint) { // mouse move
		var p2 = new b2Vec2(mouse.x, mouse.y);
		mouseJoint.SetTarget(p2);
	}
}

function getBodyAtMouse() {

	// Make a small box.
	var mousePVec = new b2Vec2();
	mousePVec.Set(mouse.x, mouse.y);

	var aabb = new b2AABB();
	aabb.minVertex.Set(mouse.x - 1, mouse.y - 1);
	aabb.maxVertex.Set(mouse.x + 1, mouse.y + 1);

	// Query the world for overlapping shapes.
	var k_maxCount = 10;
	var shapes = new Array();
	var count = world.Query(aabb, shapes, k_maxCount);
	var body = null;

	for (var i = 0; i < count; ++i) {
		if (shapes[i].m_body.IsStatic() == false) {
			if ( shapes[i].TestPoint(mousePVec) ) {
				body = shapes[i].m_body;
				break;
			}
		}
	}
	return body;
}

function setWalls() {

	if (wallsSetted) {
		world.DestroyBody(walls[0]);
		world.DestroyBody(walls[1]);
		world.DestroyBody(walls[2]);
		world.DestroyBody(walls[3]);
		walls[0] = null; 
		walls[1] = null;
		walls[2] = null;
		walls[3] = null;
	} else {
  
    wall_thickness = 20;
    
    walls[0] = createBox(world, 1910, 900, wall_thickness, 900); //  rightmost wall
    walls[1] = createBox(world, 1540, 600, wall_thickness, 300); //  wall 4 / 3
    
    walls[2] = createBox(world, 1160, 600, wall_thickness, 300); //  wall 3 / 2
    walls[3] = createBox(world, 790, 600, wall_thickness, 300); //   wall 2 / 1
    walls[4] = createBox(world, 420, 600, wall_thickness, 300); //   leftmostwall    
   
    walls[5] = createBox(world, 580, 600, 170, 10); //  4    
    walls[6] = createBox(world, 950, 750, 170, 10); //  3   
    walls[7] = createBox(world, 1320, 750, 170, 10); //  2   
    walls[8] = createBox(world, 1690, 600, 170, 10); //  1   
    
    setInterval(function() {
    
      // Check if
      if($('#podium div').size() > 0) {
        
        $('#podium div').each( function(idx, panel) {
       
        var idxWall = 5+idx;
        var yWall = 945-$(this).height();
        world.DestroyBody(walls[idxWall]);
        walls[idxWall] = createBox(world, 580+370*idx, yWall, 170, 10);      
        
        });
      }
    }, 1000);
  
  }
}

function  createBallTweetForce(t) {

	var xpos = 40;
  var ypos = 70;
   
	var element = document.createElement( 'div' );
	element.width = 96;
	element.height = 96;	
	element.style.position = 'absolute';
	element.style.left = -200 + 'px';
	element.style.top = -200 + 'px';
	element.style.cursor = "default";
  element.style.hover = "red";
	element.id = t.id_str;
  
  var id = "tweet_"+bodies.length;
  var canvas = document.getElementById('canvas');
	canvas.appendChild(element);
	elements.push( element );

  BALL_SIZE = 150;
  
  var circle = document.createElement('canvas');
  circle.width = 96;
  circle.height = 96;

  var offset = (48 - BALL_SIZE)/2;
  
  var graphics = circle.getContext('2d');
  		graphics.fillStyle = "white";
		graphics.beginPath();
		graphics.arc(BALL_SIZE* .25+10, BALL_SIZE* .25, BALL_SIZE* .25, 0, PI2, true); 
		graphics.closePath();
		graphics.fill();
    
  graphics.fillStyle = "#E2F0D6";
  graphics.beginPath();
  graphics.arc(BALL_SIZE * .5 +offset+24, BALL_SIZE * .5+offset+14, BALL_SIZE * .20, 0, PI2, true);
  graphics.closePath();
  graphics.fill();

  
  var img = new Image();
  img.src = t.profile_image_url;

  img.onload = function(){
  
    var canvasCopy = document.createElement("canvas");
    var copyContext = canvasCopy.getContext("2d");
    
    canvasCopy.width = 96;
    canvasCopy.height = 96;
    copyContext.drawImage(img, 0, 0, 96, 96);

    var ptrn = graphics.createPattern(canvasCopy,'no-repeat');
    graphics.fillStyle = ptrn;
    graphics.fill(-5,0,150,150);

  }
  
	element.appendChild( circle );

	text = document.createElement( 'div' );
	text.onSelectStart = null;
	text.style.color = "#95AB63";
	text.style.position = 'absolute';
	text.style.left = '0px';
	text.style.top = '0px';
	text.style.fontFamily = 'Georgia';
	text.style.textAlign = 'center';
	element.appendChild(text);
  
	var circle = new b2CircleDef();
	circle.radius = BALL_SIZE/4+2 ;
	circle.density = 1;
	circle.friction = 0.3;
	circle.restitution = 0.3;
  
	var b2body = new b2BodyDef();  
	b2body.AddShape(circle);
	b2body.userData = {element: element};
	b2body.position.Set( xpos, ypos);
  
  var a, b;

  switch (t.cat) { 
    case 0: // 1
      a = 150;
      b = -100;
      break; 
    case 1: // 2
      a = 250;
      b = -150;
      break; 
    case 2: // 3
      a = 350;
      b = -100;
      break; 
    case 3: // 4
      a = 390;
      b = -180;
      break;     

    default:
      a = 390;
      b = -180;
      console.log("default impulse!");
      break; 
       
  }

  b2body.linearVelocity.Set(a, b);
  b2bod[t.id_str] = world.CreateBody(b2body);
  console.log("created " + t.id_str)
	bodies.push(b2bod[t.id_str]);	
  

	$("#"+t.id_str).mouseover(function() {
    console.log(t.id_str);

		$("#tooltip-bulle .tweet-screen-name").text(t.from_user);
		$("#tooltip-bulle .tweet-full-name").text(t.from_user_name);
		$("#tooltip-bulle .tweet-text").text(t.text);
		$("#tooltip-bulle .tweet-time").text(t.created_at);
		$("#tooltip-bulle .tweet-img-avatar").attr( 'src' , t.profile_image_url );
		var thisX = parseInt($(this).css('left'),10)+10;

		 $('#bulle-tooltip-template').css('visibility','visible');
		 //$('#bulle-tooltip-template').css('top', thisX).css('left', thisY);
		$(this).css('cursor','pointer');
		if(thisX<960/2){
			$('#accolade-left').css('visibility','visible');
		}else{
			$('#accolade-right').css('visibility','visible');
		}
	    
	});
  
	$("#"+t.id_str).mouseout(function() {
		$('#bulle-tooltip-template').css('visibility','hidden');
    $('#accolade-right').css('visibility','hidden');
		$('#accolade-left').css('visibility','hidden');
		$(this).css('cursor','auto');
		
		//$(this).dequeue();
	});
   
  $("#"+t.id_str).click(function() {
		if(!isMouseDragging) {
            fancyBoxTwitter(t.from_user, (t.candidats && t.candidats.length ? candidats[t.candidats[0]].couleur : '#666699'));
//      window.open("https://twitter.com/#!/"+t.from_user+"/status/"+t.id_str);
    }
  });  
}