(function($) {
	$.fn.tinycarousel = function(options) {
		var defaults = {
			start : 1,
			display : 1,
			axis : 'x',
			controls : true,
			pager : false,
			interval : false,
			intervaltime : 300000,
			animation : true,
			duration : 1000,
			callback : null
		};
		var options = $.extend(defaults, options);
		var oSlider = $(this);
		var oViewport = $('.viewport', oSlider);
		var oContent = $('.overview', oSlider);
		var oPages = oContent.children();
		var oBtnNext = $('.next', oSlider);
		var oBtnPrev = $('.prev', oSlider);
		var oPager = $('.pager', oSlider);
		var iPageSize, iSteps, iCurrent, oTimer, bForward = true, bAxis = options.axis == 'x';
		return this.each(function() {
			initialize();
		});
		function initialize() {
			iPageSize = bAxis ? $(oPages[0]).outerWidth(true) : $(oPages[0])
					.outerHeight(true);
			var iLeftover = Math
					.ceil(((bAxis ? oViewport.outerWidth() : oViewport
							.outerHeight()) / (iPageSize * options.display)) - 1);
			iSteps = Math.max(1, Math.ceil(oPages.length / options.display)
					- iLeftover);
			iCurrent = Math.min(iSteps, Math.max(1, options.start)) - 2;
			oContent.css(bAxis ? 'width' : 'height',
					(iPageSize * oPages.length));
			move(1);
			setEvents();
		}
		function setButtons() {
			if (options.controls) {
				oBtnPrev.toggleClass('disable', !(iCurrent > 0));
				oBtnNext.toggleClass('disable', !(iCurrent + 1 < iSteps));
			}
		}
		function setEvents() {
			if (options.controls && oBtnPrev.length > 0 && oBtnNext.length > 0) {
				oBtnPrev.click(function() {
					move(-1);
					return false;
				});
				oBtnNext.click(function() {
					move(1);
					return false;
				});
			}
			if (options.pager && oPager.length > 0) {
				oPager.click(setPager);
			}
		}
		function setPager(oEvent) {
			var oTarget = oEvent.target;
			if ($(oTarget).hasClass('pagenum')) {
				iCurrent = parseInt(oTarget.rel) - 1;
				move(1);
			}
			return false;
		}
		function setPagerActive() {
			if (options.pager) {
				var oNumbers = $('.pagenum', oPager);
				oNumbers.removeClass('active');
				$(oNumbers[iCurrent]).addClass('active');
			}
		}
		function setTimer(bReset) {
			if (options.interval && !bReset) {
				clearInterval(oTimer);
				oTimer = window.setInterval(function() {
					bForward = iCurrent + 1 == iSteps ? false
							: iCurrent == 0 ? true : bForward;
					move(bForward ? 1 : -1, true);
				}, options.intervaltime);
			}
		}
		function move(iDirection, bTimerReset) {
			if (iCurrent + iDirection > -1 && iCurrent + iDirection < iSteps) {
				iCurrent += iDirection;
				var oPosition = {};
				oPosition[bAxis ? 'left' : 'top'] = -(iCurrent * (iPageSize * options.display));
				oContent.animate(oPosition, {
					queue : false,
					duration : options.animation ? options.duration : 0,
					complete : function() {
						if (typeof options.callback == 'function')
							options.callback.call(this, oPages[iCurrent],
									iCurrent);
					}
				});
				setButtons();
				setPagerActive();
				setTimer(bTimerReset);
			}
		}
	};
})(jQuery);
