YAHOO.namespace('squarebits');

YAHOO.squarebits.YCarousel = function(options) {
	
	var _private = {};
	var _public = {};

	options = options||{};

	_private.initButton = function(index) {
		_private.slideButtonElements.push(YAHOO.util.Dom.get(options.slides[index].button));
		YAHOO.util.Event.addListener(_private.slideButtonElements[index], 'click', function(event) {
			YAHOO.util.Event.stopEvent(event);
			_private.autoRotateMax = -1;
			_public.selectSlide(index);
			return false;
		});
	};

	_private.incrementSlide = function(increment) {
		var newIndex = _private.lastIndex + increment;
		if (newIndex<0) {
			newIndex = _private.slideContentElements.length - 1;
		}
		else if (newIndex>=_private.slideContentElements.length) {
			newIndex = 0;
		}
		_public.selectSlide(newIndex);
	};

	_private.postSelectSlide = function(index) {
		for (var i=0; i<_private.slideContentElements.length; i++) {
			YAHOO.util.Dom.setStyle(_private.slideContentElements[i], 'display', i===index ? '' : 'none');
			if (i==index) {
				YAHOO.util.Dom.setStyle(_private.slideContentElements[i], 'opacity', '');
				YAHOO.util.Dom.setStyle(_private.slideContentElements[i], 'filter', '');
			}
		}

		for (var i=0; i<_private.slideButtonElements.length; i++) {
			YAHOO.util.Dom.setStyle(_private.slideButtonElements[i], 'background-image', i===index ? 'url("/img/carousel-solid-circle.gif?ck=180")' : 'url("/img/carousel-open-circle.gif?ck=180")');
		}

		_private.lastIndex = index;
	};

	_private.autoRotate = function() {
		_private.incrementSlide(1);
		_private.autoRotateCount++;
		_private.resumeAutoRotate();
	};

	_private.pauseAutoRotate = function() {
		if (_private.autoRotateTimer) {
			_private.autoRotateTimer.cancel();
			_private.autoRotateTimer = null;
		}
	};

	_private.resumeAutoRotate = function() {
		if (_private.autoRotateCount<_private.autoRotateMax) {
			_private.autoRotateTimer = YAHOO.lang.later(options.autoRotateDelay, this, _private.autoRotate);
		}
	};

	_private.init = function() {
		_private.lastIndex = -1;
		_private.autoRotateMax = options.autoRotateMax;

		_private.navElement = YAHOO.util.Dom.get(options.nav);
		YAHOO.util.Event.addListener(_private.navElement, 'mouseover', function(event) {
			YAHOO.util.Dom.setStyle(_private.navElement, 'background-color', '#d0d0d0');
			_private.pauseAutoRotate();
		});
		YAHOO.util.Event.addListener(_private.navElement, 'mouseout', function(event) {
			YAHOO.util.Dom.setStyle(_private.navElement, 'background-color', '');
			_private.resumeAutoRotate();
		});

		_private.slideContentElements = [];
		_private.slideButtonElements = [];
		for (var i=0; i<options.slides.length; i++) {
			_private.slideContentElements.push(YAHOO.util.Dom.get(options.slides[i].content));
			_private.initButton(i);
		}

		_private.leftArrowButton = YAHOO.util.Dom.get(options.leftArrowButton);
		YAHOO.util.Event.addListener(_private.leftArrowButton, 'click', function(event) {
			YAHOO.util.Event.stopEvent(event);
			_private.autoRotateMax = -1;
			_private.incrementSlide(-1);
			return false;
		});

		_private.rightArrowButton = YAHOO.util.Dom.get(options.rightArrowButton);
		YAHOO.util.Event.addListener(_private.rightArrowButton, 'click', function(event) {
			YAHOO.util.Event.stopEvent(event);
			_private.autoRotateMax = -1;
			_private.incrementSlide(1);
			return false;
		});

		if (_private.autoRotateMax) {
			_private.autoRotateCount = 0;
			_private.resumeAutoRotate();
		}

		_public.selectSlide(0);
	};

	_public.selectSlide = function(index) {
		if (_private.lastIndex>=0) {
			var animFadeOut = new YAHOO.util.Anim(_private.slideContentElements[_private.lastIndex], {
				opacity: {
					to: 0.0
				}
			}, 0.3);
			animFadeOut.onComplete.subscribe(function() {

				YAHOO.util.Dom.setStyle(_private.slideContentElements[index], 'opacity', 0.0);
				YAHOO.util.Dom.setStyle(_private.slideContentElements[index], 'display', '');
				var animFadeIn = new YAHOO.util.Anim(_private.slideContentElements[index], {
					opacity: {
						to: 1.0
					}
				}, 0.3, YAHOO.util.Easing.easeBoth);
				animFadeIn.onComplete.subscribe(function() {
					_private.postSelectSlide(index);
				});
				animFadeIn.animate();

			});
			animFadeOut.animate();
		}
		else {
			_private.postSelectSlide(index);
		}
	};

	_private.init();

	return _public;
};
