	var container, stats;
	var camera, scene, renderer, particle;
	var mouseX = 0, mouseY = 0;
	var particles = [],
		MAX_PARTICLES = 300;
	 

	var windowHalfX = window.innerWidth / 2;
	var windowHalfY = window.innerHeight / 2;



	function addPart(){
		makeParticle(1); 
		if(particles.length<MAX_PARTICLES)
			setTimeout(addPart, 100);  /* 50 */ 

	}
	init();
	setInterval( loop, 1000 / 60 );

	function init() {

		var container = document.getElementById('container');
		/*document.body.appendChild(container);*/

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

		scene = new THREE.Scene();

		renderer = new THREE.CanvasRenderer();
		renderer.setSize( window.innerWidth, window.innerHeight );
		container.appendChild( renderer.domElement );

		/*stats = new Stats();
		stats.domElement.style.position = 'absolute';
		stats.domElement.style.top = '0px';
		container.appendChild( stats.domElement );*/

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

		addPart();
	}

	//

	function onDocumentMouseMove( event ) {

		mouseX = event.clientX - windowHalfX;
		mouseY = event.clientY - windowHalfY;
	}
	function onDocumentMouseDown( event ) {

		makeParticle(); 
	}
	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 loop() {
		var repelforce = new THREE.Vector3(0,0,0),
			mag, 
			repelstrength; 

		for (i=0; i<particles.length; i++){
			var p1 = particles[i]; 

			repelforce.copy(p1.position);
			
			mag = repelforce.length(); 
			repelstrength = (mag - 150) *-0.1; /* tamaņo 100 */

			if(repelstrength<0)  {
				repelforce.multiplyScalar(repelstrength/mag);
				p1.force.addSelf(repelforce); 
			}
			
			if(i>=particles.length-1) continue; 
			
			for(j=i+1; j<particles.length; j++) {
				var p2 = particles[j];

				repelforce.copy(p2.position); 
				repelforce.subSelf(p1.position); 
				mag = repelforce.length(); 
				repelstrength = 150-mag; /* 50 */

				if((repelstrength>0)&&(mag>0))	{

					repelforce.multiplyScalar(repelstrength*0.05 / mag); 

					p1.force.subSelf(repelforce); 
					p2.force.addSelf(repelforce); 
				}
			}
		}


		// iteratate through each particle
		for (i=0; i<particles.length; i++){
			var particle = particles[i]; 

			particle.update();
		
		}

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

		renderer.render( scene, camera );

		stats.update();
	}
	
	function makeParticle(){
		
		var color = 0xd0 + Math.random()*0x20; 
		color = color<<100 | color<<35 | color<<255; 
		particle = new Particle3D( new THREE.ParticleCircleMaterial( { color: color, opacity: 1 } ) );

		particle.scale.x = particle.scale.y = 5;
		scene.addObject( particle );
	
		particle.position.set(0,0,0); 
		particle.velocity.set(1,0,0);
		particle.velocity.rotateZ(Math.random()*90);
		particle.velocity.rotateY(Math.random()*360); 
	
		particle.drag = 0.96;
	
		particles.push(particle); 
	}
