function layout(bubbles){
    /**
	*Basado en 
	* A spring embedder layout algorithm. See, e.g. G. Di Battista et
	* al.: "Graph Drawing", pp. 303, Prentice Hall, 1999.
	*
	* version 	$ProjectVersion: 2-1-0-release.1 $
	* author      Mark Richters
	*
	* Calculates a layout. This method may be called repeatedly for
	* refining the layout if the graph does not change between calls.
	*/
	function doLayout() {
		var N = bubbles.length;
    	var k1 = 1.0;
		var k2 = 100.0 * 100.0;
		var fEdgeLen = 110.0+(N*5);
	
		var xc = 0.0;
		var yc = 0.0;
		for (var i = 0; i < N; i++) {
			var v=bubbles[i];
			var xv = v.getX();
			var yv = v.getY();

			// spring force
			//todos los nodos
			//Iterator uIter = fGraph.sourceNodeSet(v).iterator();
	    var sumfx1 = 0.0;
	    var sumfy1 = 0.0;
	    //while ( uIter.hasNext() ) {
		for (var j=0;j < N ; j++){
		var u=bubbles[j];
//  		System.out.println("spring  u = " + u);
		var xu = u.getX();
		var yu = u.getY();
		var dx = xv - xu;
		var dy = yv - yu;
		var d = Math.sqrt(dx * dx + dy * dy);
		d = (d == 0) ? .0001 : d;
		var c = k1 * (d - fEdgeLen) / d;
		sumfx1 += c * dx;
		sumfy1 += c * dy;
	    }
		
		//  System.out.println("sumfx1 = " + sumfx1);
		//  System.out.println("sumfy1 = " + sumfy1);


	    // electrical force

	    //uIter = fGraph.iterator();
	    var sumfx2 = 0.0;
	    var sumfy2 = 0.0;
		for (var k=0;k < N ; k++){
			//while ( uIter.hasNext() ) {
			var u=bubbles[k];
			//PlaceableNode u = (PlaceableNode) uIter.next();
			if ( u != v ){
				//System.out.println("electrical  u = " + u);
				var xu = u.getX();
				var yu = u.getY();
				var dx = xv - xu;
				var dy = yv - yu;
				var d = dx * dx + dy * dy;
				if ( d > 0 ) {
					var c = k2 / (d * Math.sqrt(d));
					sumfx2 += c * dx;
					sumfy2 += c * dy;
				}
			}
	    }
		//  	    System.out.println("sumfx2 = " + sumfx2);
		//  	    System.out.println("sumfy2 = " + sumfy2);

	    // store new positions
  	    fXn[i] = xv - Math.max(-5, Math.min(5, sumfx1 - sumfx2));
  	    fYn[i] = yv - Math.max(-5, Math.min(5, sumfy1 - sumfy2));

	    // for determining the center of the graph
	    xc += fXn[i];
	    yc += fYn[i];
	}

	// offset from center of graph to center of drawing area
	var dx = fWidth / 2 - xc / N;
	var dy = fHeight / 2 - yc / N;

	// use only small steps for smooth animation
	dx = Math.max(-5, Math.min(5, dx));
	dy = Math.max(-5, Math.min(5, dy));

		// set new positions
		//la burbuja 1 es el raton y la 0 la elipse.
		for (var i = 2; i < N; i++) {
			var v=bubbles[i];
			// move each node towards center of drawing area and keep
			// it within bounds
			var x = Math.max(fMarginX, Math.min(fWidth - fMarginX, fXn[i] + dx));
			var y = Math.max(fMarginY, Math.min(fHeight - fMarginY, fYn[i] + dy));
			v.setX(x);
			v.setY(y);
		}
	}

	var bubbles = bubbles; //array de busrbujas
	var fWidth = 500;
	var fHeight = 280;
	var fMarginX = 10;
	var fMarginY = 10;
	var fXn=new Array(bubbles.length);
	var fYn=new Array(bubbles.length);
	
	
	this.doLayout=doLayout;
}