document.observe("dom:loaded", function() {
	$$('.carousel').each ( function(carousel) {

		carousel.displayWidth = carousel.getWidth();
		carousel.actualWidth = 0;
		//PbLib.log (carousel.childElements());
		carousel.firstDescendant().childElements().each ( function(carouselElement){
			carousel.actualWidth += carouselElement.getWidth();
		});
		if (carousel.actualWidth > carousel.displayWidth) {
			carousel.observe('mouseover', function(){CarouselEvent.pause();});
			carousel.observe('mouseout', function(){CarouselEvent.restart(carousel);});
			$('carousel-left').observe('click', function(){CarouselEvent.changeState(carousel, 'left');});
			$('carousel-right').observe('click', function(){CarouselEvent.changeState(carousel, 'right');});
			new CarouselEvent.play(carousel);
		} else {
			$('carousel-left').hide();
			$('carousel-right').hide();
		}
	});
});

var CarouselEvent = {};
CarouselEvent.direction = 'right';
CarouselEvent.play = function (carousel)
{
	var element = carousel.firstDescendant().identify();
	var left = carousel.actualWidth - carousel.displayWidth;
	var pos = (carousel.positionedOffset().left) - (carousel.firstDescendant().positionedOffset().left);
	CarouselEvent.direction = CarouselEvent.direction == 'left' ? 'right' : 'left';
	var options = {
		x : (CarouselEvent.direction == 'left' ? (left * -1) : left),
		y : 0,
		fps: 200,
		duration: left * 0.02,
		transition: Effect.Transitions.sinoidal,
		afterFinish: function() {
			CarouselEvent.play(carousel);
		}
	}
	CarouselEvent.event = Effect.MoveBy(element, 0, 0, options);
}

CarouselEvent.pause = function ()
{
	if (CarouselEvent.event) {
		CarouselEvent.event.cancel();
	}
}

CarouselEvent.restart = function (carousel)
{
	var element = carousel.firstDescendant().identify();
	var left = carousel.actualWidth - carousel.displayWidth;
	var pos = (carousel.positionedOffset().left) - (carousel.firstDescendant().positionedOffset().left);
	var width = CarouselEvent.direction == 'left' ? (pos - left) : pos;
	var options = {
		x : width,
		y : 0,
		fps: 200,
		duration: CarouselEvent.direction == 'left' ? (width * 0.02) * -1 : width * 0.02,
		transition: Effect.Transitions.sinoidal,
		afterFinish: function() {
			CarouselEvent.play(carousel);
		}
	}
	CarouselEvent.event = Effect.MoveBy(element, 0, 0, options);
}

CarouselEvent.changeState = function (carousel, direction)
{
	if (CarouselEvent.event) {
		CarouselEvent.event.cancel();
	}
	CarouselEvent.direction = direction;
	var element = carousel.firstDescendant().identify();
	var left = carousel.actualWidth - carousel.displayWidth;
	var pos = (carousel.positionedOffset().left) - (carousel.firstDescendant().positionedOffset().left);
	var width = CarouselEvent.direction == 'left' ? (pos - left) : pos;
	var options = {
		x : width,
		y : 0,
		fps: 200,
		duration: CarouselEvent.direction == 'left' ? (width * 0.005) * -1 : width * 0.005,
		transition: Effect.Transitions.sinoidal,
		afterFinish: function() {
			CarouselEvent.play(carousel);
		}
	}
	CarouselEvent.event = Effect.MoveBy(element, 0, 0, options);
}