/**
 * 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'});
	try {
		if (!this.css('position').match(/absolute|relative/)) this.css({'display': 'relative'});
	} catch(e) {
		// In ie8 on blueq home this.css('position') fails
	}
	container.css({'width': blocks.filter(':first').get(0).clientWidth+'px', 'height': blocks.filter(':first').get(0).clientHeight+'px'});

	var slide;
	slide=function(dir) {
		// Schedule next
		clearTimeout(container.timeOut);
		container.timeOut=setTimeout(function() {slide(true);}, settings.interval * 1000);
		
		var current=$(settings.selector, container).filter('.current');

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

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

	$('a.next[rel="'+container.attr('id')+'"]').click(function() {slide(true);});
	$('a.prev[rel="'+container.attr('id')+'"]').click(function() {slide(false);});		
	container.timeOut=setTimeout(function() {slide(true);}, settings.interval * 1000);

	return  blocks;
}

