/**
 * Face in/out block elements in a slide show.
 *
 * @package    JQuery
 * @author     Daniel Sevcik <sevcik@webdevelopers.cz>
 * @version    $Revision: 1.0 $
 * @copyright  2010 Daniel Sevcik
 * @since      2010-06-04
 * @access     public
 */

jQuery.fn.blockSlide=function(options) {
	var settings=jQuery.extend({
			interval: 5,
			speed: 1,
			random: false,
			selector: '> *' /* By default immediate children of the element */
		}, options);
	
	var blocks=$(settings.selector, this).css({'display': 'none', 'position': 'absolute', 'z-index': 0});
	if (blocks.length < 2) return;
	blocks.filter(':first').css({'display': 'block'}).addClass('current');
	
	var container=this.css({'display': 'block', 'overflow': 'hidden'});
	if (!this.css('position').match(/absolute|relative/)) this.css({'display': 'relative'});
	container.css({'width': blocks.filter(':first').get(0).clientWidth+'px', 'height': blocks.filter(':first').get(0).clientHeight+'px'});
	
	var slide=function() {
		var current=$(settings.selector, container).filter('.current');

		if (settings.random) {
			var next=$(current.siblings().get(Math.floor(Math.random() * current.siblings().length)));
		} else {
			var next=current.next().length ? current.next() : $(settings.selector, container).filter(':first');
		}
	  
		current.css({'z-index': 0}).addClass('fadeout');
		next.css({'opacity': 0, 'z-index': 1, 'display': 'block'}).addClass('current fadein');

		// Animate
		container.animate({'width': next.get(0).clientWidth+'px', 'height': next.get(0).clientHeight+'px'}, settings.speed * 1000);
		current.animate({opacity: 0}, settings.speed * 1000);		
		next.animate({opacity: 1.0}, settings.speed * 1000, function() {
				current.css({'display': 'none'}).removeClass('current fadeout');
				next.removeClass('fadein');
			});
	};
	setInterval(slide, settings.interval * 1000);
	return  blocks;
}
