(function(jQuery){

        var opts = {
            nextButtonID :        "next",
            prevButtonID :        "prev",
            sliderItemClass :     "item",
            controlButtonClass :  "control",
            withSlideSelector  :  false,
            slideSelectorClass :  "slide_selector",
            slideSelectorOnClass: 'slide_selector_on',
            slideSelectorPrefixID: 'selector_',
            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,
            stopSlider :          false  
        };
        
        var methods = {
            init: function(sliderOpts){
                return this.each(function(){
                    jQuery.extend(opts, sliderOpts);
                    
                    mainContentElement = jQuery(this);
                    lastSlide = opts.totalSlides-1;
                    
                    if(opts.carrousel == true)
                    {
                        var item = jQuery('.'+opts.sliderItemClass);
                        item.last().after(item.first().clone());
                        lastSlide = lastSlide+1;
                        
                        mainContentElement.css({
                        'width' : (opts.slideWidth * (opts.totalSlides+1))+"px"
                        });
                    }
                    else
                    {
                        mainContentElement.css({
                        'width' : (opts.slideWidth * opts.totalSlides)+"px"
                        });
                    }
                    
                    if(opts.carrousel != true)
                    {
                        if(opts.currentPosition==lastSlide) jQuery('#'+opts.nextButtonID).removeClass('active');
                        else jQuery('#'+opts.nextButtonID).addClass('active');

                        if(opts.currentPosition==0) jQuery('#'+opts.prevButtonID).removeClass('active');
                        else jQuery('#'+opts.prevButtonID).addClass('active');
                    }
                    
                    if(opts.autoSlide == true)
                    {
                        this.direction = opts.autoSlideDirection=='next' ? opts.nextButtonID : opts.prevButtonID;
                        setInterval("jQuery('#"+this.direction+"').trigger('click')", opts.autoSlideInterval);
                    }
                });
            },
            //hide or show controllers for slider!
            manageControls: function(){
            
                if(opts.carrousel != true)
                {
                    if(opts.currentPosition==lastSlide) jQuery('#'+opts.nextButtonID).removeClass('active');
                    else jQuery('#'+opts.nextButtonID).addClass('active');

                    if(opts.currentPosition==0) jQuery('#'+opts.prevButtonID).removeClass('active');
                    else jQuery('#'+opts.prevButtonID).addClass('active');
                }
            },
            animateSlide: function(el, reset){
                // animate slider content with marginLeft :)
                if(opts.stopSlider) return;
                
                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) ? parseInt(opts.currentPosition+1) : parseInt(opts.currentPosition-1);
                marginValue = opts.slideWidth*(-opts.currentPosition);
                if(opts.withSlideSelector == true)
                {
                    jQuery("."+opts.slideSelectorClass).removeClass(opts.slideSelectorOnClass);
                    if(opts.carrousel == true && opts.currentPosition==lastSlide)  jQuery("#"+(opts.slideSelectorPrefixID+0)).addClass(opts.slideSelectorOnClass);
                    else jQuery("#"+(opts.slideSelectorPrefixID+parseInt(opts.currentPosition))).addClass(opts.slideSelectorOnClass);
                }

                mainContentElement.animate({
                    'marginLeft' : marginValue
                }, opts.slideSpeed);
            },
            startSlider: function(){
                return this.each(function(){
                    jQuery("#"+(opts.autoSlideDirection=='next' ? opts.nextButtonID : opts.prevButtonID)).trigger('click');
                });
            },
            goToSlide: function(slideNumber){
                opts.currentPosition = parseInt(slideNumber);
                marginValue = opts.slideWidth*(-opts.currentPosition);

                mainContentElement.animate({
                    'marginLeft' : marginValue
                }, opts.slideSpeed);                
            }
        }
        
    jQuery.fn.Slider = function (method)
    {        
        jQuery("."+opts.controlButtonClass).click(function(){
            if(opts.autoSlide == true || opts.carrousel == true)
            {
                if(opts.currentPosition == lastSlide || opts.currentPosition == 0)
                {
                    methods.animateSlide(jQuery(this), true);
                    methods.manageControls();
                }
                else
                {
                    methods.animateSlide(jQuery(this), false);
                    methods.manageControls();
                }
            }
            else
            {
                methods.animateSlide(jQuery(this), false);
                methods.manageControls();
            }
        });
        
        jQuery("."+opts.slideSelectorClass).click(function(){
            methods.goToSlide(jQuery(this).parent().attr('id'));
            jQuery("."+opts.slideSelectorClass).removeClass(opts.slideSelectorOnClass);
            jQuery(this).addClass(opts.slideSelectorOnClass);
        });
        
        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            jQuery.error( 'Method ' +  method + ' does not exist on jQuery.Slider' );
        }
    }
})(jQuery);

