(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 = oContent.parent(0).parent(0).parent(0).find('.next:first',root);
	var oBtnPrev=oContent.parent(0).parent(0).parent(0).find('.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);
