/**
 * @author FamiliaDM
 */

(function($) {
	$.tiny = $.tiny || {};
	$.tiny.carousel = {
		options : {
			start : 1,
			display : 1,
			axis : 'x',
			controls : true,
			pager : false,
			interval : false,
			intervaltime : 3000,
			rewind : false,
			animation : true,
			duration : 1000,
			callback : null
		}
	};
	$.fn.tinycarousel = function(options) {
		var options = $.extend( {}, $.tiny.carousel.options, options);
		this.each(function() {
			$(this).data('tcl', new Carousel($(this), options));
		});
		return this;
	};
	$.fn.tinycarousel_start = function() {
		$(this).data('tcl').start();
	};
	$.fn.tinycarousel_stop = function() {
		$(this).data('tcl').stop();
	};
	$.fn.tinycarousel_move = function(iNum) {
		$(this).data('tcl').move(iNum - 1, true);
	};
	function Carousel(root, options) {
		var oSelf = this;
		var oViewport = $('.viewport:first', root);
		var oContent = $('.overview:first', root);
		var oPages = oContent.children();
		var oBtnNext = $('.next:first', root);
		var oBtnPrev = $('.prev:first', root);
		var oPager = $('.pager:first', root);
		var iPageSize, iSteps, iCurrent, oTimer, bPause, bForward = true, bAxis = options.axis == 'x';
		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));
			oSelf.move(1);
			setEvents();
			return oSelf;
		}
		;
		function setEvents() {
			if (options.controls && oBtnPrev.length > 0 && oBtnNext.length > 0) {
				oBtnPrev.click(function() {
					oSelf.move(-1);
					return false;
				});
				oBtnNext.click(function() {
					oSelf.move(1);
					return false;
				});
			}
			if (options.interval) {
				root.hover(oSelf.stop, oSelf.start);
			}
			if (options.pager && oPager.length > 0) {
				$('a', oPager).click(setPager);
			}
		}
		;
		function setButtons() {
			if (options.controls) {
				oBtnPrev.toggleClass('disable', !(iCurrent > 0));
				oBtnNext.toggleClass('disable', !(iCurrent + 1 < iSteps));
			}
			if (options.pager) {
				var oNumbers = $('.pagenum', oPager);
				oNumbers.removeClass('active');
				$(oNumbers[iCurrent]).addClass('active');
			}
		}
		;
		function setPager(oEvent) {
			if ($(this).hasClass('pagenum')) {
				oSelf.move(parseInt(this.rel), true);
			}
			return false;
		}
		;
		function setTimer() {
			if (options.interval && !bPause) {
				clearTimeout(oTimer);
				oTimer = setTimeout(function() {
					iCurrent = iCurrent + 1 == iSteps ? -1 : iCurrent;
					bForward = iCurrent + 1 == iSteps ? false
							: iCurrent == 0 ? true : bForward;
					oSelf.move(bForward ? 1 : -1);
				}, options.intervaltime);
			}
		}
		;
		this.stop = function() {
			clearTimeout(oTimer);
			bPause = true;
		};
		this.start = function() {
			bPause = false;
			setTimer();
		};
		this.move = function(iDirection, bPublic) {
			iCurrent = bPublic ? iDirection : iCurrent += iDirection;
			if (iCurrent > -1 && iCurrent < iSteps) {
				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();
				setTimer();
			}
		};
		return initialize();
	}
	;
})(jQuery);
