function distribuir($items,zonas) {
	var largo = $items.length;
	var largoZonas = zonas.length;
	var area = 0;
	$items.each(function() {
		var w = $(this).width();
		var h = $(this).height();
		area += w*h;	
	});
	var areaZonas = 0;
	$(zonas).each(function() {
		areaZonas = (this.xf-this.xi)*(this.yf-this.yi);
	});
	if (zonas.length > 0 && area <= areaZonas) { // Utilizar una integral para perfeccionarlo...
		var j = 0;
		var x = null,y = null;
		var safe = [];
		var $item;
		for (i = 0; i < largo; i++) {
			$item = $items.eq(i);
			do {
				x = $.random(zonas[j].xi,zonas[j].xf);
				y = $.random(zonas[j].yi,zonas[j].yf);
			}
			// Esto habrķa que hacerlo por backtracking para que sea 100% seguro.
			while(distribuir_hitTest(x,y,$item.width(),$item.height(),safe));
			safe.push({xi:x,xf:x+$item.width(),yi:y,yf:y+$item.height()});
			$item.css({left:x+"px",top:y+"px"});
			if (j < largoZonas-1) {
				j++;	
			}
			else {
				j=0;
			}
		}
	}
}
function distribuir_hitTest(x,y,w,h,safe) {
	return distribuir_puntoEnCuadrado(x,y,safe) || distribuir_puntoEnCuadrado(x+w,y,safe) || distribuir_puntoEnCuadrado(x,y+h,safe) || distribuir_puntoEnCuadrado(x+w,y+h,safe);
}
function distribuir_puntoEnCuadrado(x,y,safe) {
	if (safe.length != 0 && x != null || y != null) {
		var largo = safe.length;
		for (i = 0; i < largo; i++) {
			if (safe[i].xi <= x && x <= safe[i].xf && safe[i].yi <= y && y <= safe[i].yf) {
				return true;	
			}
		}
	}
	return false;
}
var sinewave_cache = new Array();
function SineWave(xf,yf,dy,a,cache) {
	this.css = function(p) {
		if (cache[xf] !== undefined && cache[xf][yf] !== undefined && cache[xf][yf][dy] !== undefined && cache[xf][yf][dy][a] !== undefined && cache[xf][yf][dy][a][p] !== undefined) {
			return cache[xf][yf][dy][a][p];	
		}
		var s = Math.sin(p*16);
		var y = yf - p * dy;
		var x = s * a + xf;
		var res = {top: y + "px", left: x + "px"};
		if (cache[xf] === undefined) {
			cache[xf] = new Array();
		}
		else {
			if (cache[xf][yf] === undefined) {
				cache[xf][yf] = new Array();	
			}
			else {
				if (cache[xf][yf][dy] === undefined) {
					cache[xf][yf][dy] = new Array();
				}
				else {
					if (cache[xf][yf][dy][a] === undefined) {
						cache[xf][yf][dy][a] = new Array();	
					}
					else {
						cache[xf][yf][dy][a][p] = res;	
					}
				}
			}
		}
		return res;
	} 
}
function levitar(selector,dx,dy,sinewave_cache) {
	$(selector).each(function() {
		var $elem = $(this);
		var xi = parseInt($elem.css("left"));
		var yi = parseInt($elem.css("top"));
		var xf = xi+dx;
		var yf = yi+dy;
		var a = $.random(2,4);
		var v = $.random(4,6)*1000;
		$elem.animate({path: new SineWave(xf,yf,dy,a,sinewave_cache) },v,"linear").animate({path: new SineWave(xi,yi,dy*-1,a*-1,sinewave_cache) },v,"linear",function() { levitar($elem.get(0),dx,dy,sinewave_cache); });	
	});
}
function aparecer_randomicamente(selector) {
	var $elementos = $(selector);
	var $invisibles = $elementos.not(".visible");
	var count = $invisibles.length;
	if (count > 0) {
		var $elemento = $invisibles.eq($.random(0,count-1));	
		$elemento.addClass("visible");
		if (!$.browser.msie) {
			$elemento.css({opacity:0});
			$elemento.animate({opacity:1},$.random(200,500),'easeInCirc',function() { aparecer_randomicamente(selector); });
		}
		else {
			setTimeout(function() { aparecer_randomicamente(selector); },$.random(200,500));
		}
	}
}
function aparecer_circularmente(selector,conf,i,queue) {
	var $elements = $(selector);
	var angle = Math.ceil(360 / $elements.length);
	if (queue) {
		conf.end = conf.start - (i+1)*angle;
		if (!$.browser.msie) {
			$elements.eq(i).animate({path : new $.path.arc(conf),opacity: '1'},200 + (100*i),'easeOutQuad',function() { aparecer_circularmente(selector,conf,i+1,queue); }); 
		}
		else {
			$elements.eq(i).animate({path : new $.path.arc(conf)},200 + (100*i),'easeOutQuad',function() { aparecer_circularmente(selector,conf,i+1,queue); });
		}
	}
	else {
		$elements.each(function(i) {
			conf.end = conf.start - (i+1)*angle;
			if (!$.browser.msie) {
				$elements.eq(i).animate({path : new $.path.arc(conf),opacity: '1'},2500,'easeOutQuad');
			}
			else {
				$elements.eq(i).animate({path : new $.path.arc(conf)},2500,'easeOutQuad');
			}
		});
	}
}
