var mouseX = 0, mouseY = 0,

windowHalfX = window.innerWidth / 2,
windowHalfY = window.innerHeight / 2,

SEPARATION = 200,
AMOUNTX = 10,
AMOUNTY = 10,

camera, scene, renderer;

init();
animate();

function init() {

	var canvas, separation = 100, amountX = 50, amountY = 50,
	particles, particle;
	
	canvas = document.getElementById('canvas_container');

	camera = new THREE.Camera( 75, window.innerWidth / window.innerHeight, 1, 10000 );
	camera.position.z = 100;

	scene = new THREE.Scene();

	renderer = new THREE.CanvasRenderer();
	renderer.setSize( window.innerWidth, window.innerHeight );
	renderer.domElement.setAttribute("id", "canvas");
	canvas.appendChild( renderer.domElement );
            
	// particles

	var PI2 = Math.PI * 0;
	
	var material = new THREE.ParticleCanvasMaterial( {

		color: 0xffffff,
		program: function ( context ) {

			context.beginPath();
			context.arc( 0, 0, 1, 0, PI2, true );
			context.closePath();
			context.fill();

		}

	} );
	
	var material_2 = new THREE.ParticleCanvasMaterial( {

		color: 0xffffff,
		program: function ( context ) {

			context.beginPath();
			context.arc( 0, 0, 1, 0, PI2, true );
			context.closePath();
			context.fill();

		}

	} );

	var geometry = new THREE.Geometry();

	for ( var i = 0; i < 100; i ++ ) {

		particle = new THREE.Particle( material );
		particle.position.x = Math.random() * 2 - 1;
		particle.position.y = Math.random() * 2 - 1;
		particle.position.z = Math.random() * 2 - 1;
		particle.position.normalize();
		particle.position.multiplyScalar( Math.random() * 10 + 1400 );
		particle.scale.x = particle.scale.y = 5;
		scene.addObject( particle );

		geometry.vertices.push( new THREE.Vertex( particle.position ) );

	}
	
	var geometry2 = new THREE.Geometry();
	
	for ( var i = 0; i < 100; i ++ ) {

		particle = new THREE.Particle( material_2 );
		particle.position.x = Math.random() * 2 - 1;
		particle.position.y = Math.random() * 2 - 1;
		particle.position.z = Math.random() * 2 - 1;
		particle.position.normalize();
		particle.position.multiplyScalar( Math.random() * 10 + 900 );
		particle.scale.x = particle.scale.y = 10;
		scene.addObject( particle );

		geometry2.vertices.push( new THREE.Vertex( particle.position ) );

	}
	

	// lines
	
	var line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { linewidth: 20, color: 0xa8aeaf, opacity: 0.5 } ) );
	scene.addObject( line );
	
	var line2 = new THREE.Line( geometry2, new THREE.LineBasicMaterial( { linewidth: 20, color: 0x11c3d3, opacity: 0.5 } ) );
	scene.addObject( line2 );

	document.addEventListener( 'mousemove', onDocumentMouseMove, false );
	document.addEventListener( 'touchstart', onDocumentTouchStart, false );
	document.addEventListener( 'touchmove', onDocumentTouchMove, false );
}

//

function onDocumentMouseMove(event) {

	mouseX = event.clientX - windowHalfX;
	mouseY = event.clientY - windowHalfY;
}

function onDocumentTouchStart( event ) {

	if ( event.touches.length > 1 ) {

		event.preventDefault();

		mouseX = event.touches[ 0 ].pageX - windowHalfX;
		mouseY = event.touches[ 0 ].pageY - windowHalfY;

	}

}

function onDocumentTouchMove( event ) {

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

		event.preventDefault();

		mouseX = event.touches[ 0 ].pageX - windowHalfX;
		mouseY = event.touches[ 0 ].pageY - windowHalfY;

	}

}

//

function animate() {

	requestAnimationFrame( animate );

	render();

}

function render() {

	camera.position.x += ( mouseX - camera.position.x ) * .05;
	camera.position.y += ( - mouseY + 200 - camera.position.y ) * .05;

	renderer.render( scene, camera );

}
