(function($) {
        $.fn.extend({
            imageAlternator: function(options) {
                var settings = $.extend({}, $.fn.imageAlternator.defaults, options);
                var outofRotation = [];
                var inRotation = []; 
                
                //load additional images
                var addImages = [];
                for (var i=0; i < settings.additionalImages.length; i++) {
                    var img = new Image();
                    img.src = settings.additionalImages[i];
                    outofRotation.push(img);
                }

                inRotation = shuffle(this);
                        
                setTimeout(function() {
                   alternate();
                },settings.pause);
                
            
                function alternate() {
                    //take a random image in rotation out, substitute with an image in out
                    if (outofRotation.length == 0) {
                        console.warn("Please include additional images to rotate in.");
                        return;
                    }
                    var $imageOld = $(inRotation.splice(0,1)[0]);
                    outofRotation = shuffle(outofRotation);
                    var $imageNew = $(outofRotation.splice(0,1)[0]);
                    var $parent = $imageOld.parent();
                    $parent.append($imageNew);                    
                    inRotation.push($imageNew[0]);
                    outofRotation.push($imageOld.detach()[0]);   
                    $imageNew.hide().fadeIn(settings.transitionTime);
                    setTimeout(arguments.callee, settings.pause);
                }
            
                function shuffle(o) {
                    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
                    return o;                    
                }
            
            
                return this.each(function () {
                    var $$    = $(this),
                        o    = $.metadata ? $.extend({}, settings, $$.metadata()) : settings;
                });
            }
        });
        
        $.fn.imageAlternator.defaults = {
            additionalImages: [],
            pause: 1000,
            transitionTime: 200
        };
        
})(jQuery);
