(function($){
    
    xfade = function(elem, options){
        var data = {
            interval: null,
            elems: [],
            current: 0,
            playing: false,            
            next: function(){},
            settings: $.extend({
                interval: 2000,
                speed: 300,
                elems: '',
                autoplay: false
            }, options)
        }
        
        function reset_interval(){
            clear_interval();
            data.interval = setInterval(tick, data.settings.interval);
        }
        
        function clear_interval(){
            try{
                clearInterval(data.interval);
            } catch(e){}
        }
        
        function tick(){
            data.next();
        }        
        data.next = function(){
          
            if(data.playing) {
              clear_interval();
            }     
            $(data.elems[data.current]).css('opacity', 1);     
            $(data.elems[data.current]).fadeOut(data.settings.speed, function(){  
                if(data.playing) {
                  reset_interval();   
                }                      
              });
            
             data.current++;             
             if(data.current >= data.elems.length) {
               data.current = 0;
             }            
             
            $(data.elems[data.current]).css('opacity', 1); 
            $(data.elems[data.current]).fadeIn(data.settings.speed, function(){         
            });          

            return data;
        };
        
        data.elems = $(elem).children(data.settings.elems).get();

        return data;
    }
    
    $.fn.xfade = function(options){
        return $(this).each(function(){
            $(this).data('xfade', xfade(this, options));
        });
    }

})(jQuery);
