(function($){
    $.fn.tinycarousel=function(options){
        var defaults={
            start:0,
            display:1,
            axis:'y',
            controls:false,
            pager:true,
            interval:true,
            intervaltime:5000,
            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)));
            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);
