(function($){
    $.fn.Slider = function (sliderOpts)
    {
        return this.each(function(){
            var opts = {
                nextButtonID :        "next",
                prevButtonID :        "prev",
                sliderItemClass :     "item",
                controlButtonClass :  "control",
                autoSlide :           false,
                autoSlideInterval  :  5000,
                autoSlideDirection :  "next", //slide direction always has to be "next" or "prev"
                carrousel :           false,
                totalSlides :         0,
                sliderData :          '',
                currentPosition :     0,
                slideWidth :          100,
                slideSpeed :          400
            };
            $.extend(opts, sliderOpts);
            
            var mainContentElement = $(this);
            var lastSlide = opts.totalSlides-1;
                       
            //show or hide next and prev controls
            var manageControls = function(){
                if(opts.carrousel != true)
                {
                    if(opts.currentPosition==lastSlide) $('#'+opts.nextButtonID).removeClass('active');
                    else $('#'+opts.nextButtonID).addClass('active');

                    if(opts.currentPosition==0) $('#'+opts.prevButtonID).removeClass('active');
                    else $('#'+opts.prevButtonID).addClass('active');
                }
            };
            
            var animateSlide = function(el, reset){
                // animate slider content with marginLeft :)
                if(reset == true) 
                {
                    if(opts.currentPosition == 0 && el.attr('id') == opts.prevButtonID) opts.currentPosition = lastSlide;
                    else if(opts.currentPosition == lastSlide && el.attr('id') == opts.nextButtonID) opts.currentPosition = 0;
                   
                    if(opts.carrousel == true)
                    {
                        mainContentElement.css('marginLeft', opts.slideWidth*(-opts.currentPosition));
                    }
                }  
                opts.currentPosition = (el.attr('id')==opts.nextButtonID) ? opts.currentPosition+1 : opts.currentPosition-1;
                marginValue = opts.slideWidth*(-opts.currentPosition);

                mainContentElement.animate({
                    'marginLeft' : marginValue
                }, opts.slideSpeed);
            };

            var init = function(){
                if(opts.carrousel == true)
                {
                    item = $('.'+opts.sliderItemClass);
                    firstClonedItem = item.first().clone();
                    item.last().after(firstClonedItem);
                    lastSlide = lastSlide+1;
                    
                    mainContentElement.css({
                    'width' : (opts.slideWidth * (opts.totalSlides+1))+"px"
                    });
                }
                else
                {
                    mainContentElement.css({
                    'width' : (opts.slideWidth * opts.totalSlides)+"px"
                    });
                }            
            };
            
            init();
            manageControls();
            
            $("."+opts.controlButtonClass).click(function(){
                if(opts.autoSlide == true || opts.carrousel == true)
                {
                    if(opts.currentPosition == lastSlide || opts.currentPosition == 0)
                    {
                        animateSlide($(this), true);
                        manageControls();
                    }
                    else
                    {
                        animateSlide($(this), false);
                        manageControls();
                    }
                }
                else
                {
                    animateSlide($(this), false);
                    manageControls();
                }
            });
            
            if(opts.autoSlide==true)
            {
                setInterval("$('#"+(opts.autoSlideDirection=='next' ? opts.nextButtonID : opts.prevButtonID)+"').trigger('click')", opts.autoSlideInterval);
            }

        });
    }
})(jQuery);

