$(document).ready(function(){
    $.fn.W3SImageFader = function(options){            
        //settings:
        var settings = $.extend({
            interval: 5000,
            speed: 500,
            shuffle: true,
            currImage: 0,
            target: 'img',
            resize: false,
            resizespeed: 1000,
            height: []
        }, options);
        
        //element caching
        var $element = this,
            $images = $element.children(settings.target),
            length = $images.length;
        
        //calculate height
        var calculateHeights = function(){
            if (settings.resize === true){
                for(i=0; i<length; i++){
                    settings.height[i] = $images.eq(i).height() + "px";
                }
            }
        }
        
        calculateHeights();
        $images.hide();
        resizeParent();
        
        var getRandomImage = function(max){
            return Math.floor(Math.random() * max);
        }
        
        var shuffle = function(){
            var $tempImages = $element.children(settings.target);
            
            var newOrder = $.map($tempImages, function(){
                var randomEq = getRandomImage($tempImages.length),
                    $randomElement = $tempImages.eq(randomEq).clone(true)[0];
                
                $tempImages.splice(randomEq,1);
                return $randomElement;
            });
            
            $images.each(function(i){
                $(this).replaceWith($(newOrder[i]));
            });
        }
        
        if (settings.shuffle == true){
            shuffle();
            $images = $element.children(settings.target);
            calculateHeights();
        }
        
        function incrementImageCounter(){
            settings.currImage++;
            if (settings.currImage >= length){
                settings.currImage = 0;
            }
        }
        
        function resizeParent(){
            if (settings.resize === true){
                $element.stop().animate({"height": settings.height[settings.currImage]}, settings.resizespeed);
            }
        }
        
        $images.eq(settings.currImage).fadeIn(500);
        
        var interval = setInterval(function(){
            $images.eq(settings.currImage).fadeOut(settings.speed);
            
            incrementImageCounter();
            resizeParent();
            
            $images.eq(settings.currImage).fadeIn(settings.speed);
        }, settings.interval)
        
        //Chainability:
        return this;
    };
});
