  (function($) {
  
	function format(str) {
		for (var i = 1; i < arguments.length; i++)
			str = str.replace(new RegExp('\\{' + (i-1) + '}', 'g'), arguments[i]);
		return str;
	}

  $.fn.rotator = function(conf, q) {
  
    var conf= conf;  
    var $this = $(this);

      var settings = conf;
      var queue = q, queue_loaded = 0;
      
      $this.css({position: 'relative'});
      
      var proceed = function() {

        $this.html('');
        var q;
        for (var i=0; i < queue_loaded; i++) {
          q = queue[i];
          queue[i]['id'] = i;
          if (q.href)  $this.append(format('<a href="{0}" target="{1}"><img src="{2}" style="position:absolute; top: 0; left: 0; visibility: {4}" class="queue-{3}"></a>',q.href, q.target, q.src, i, (i==0 ? 'visible' : 'hidden')));
          else   $this.append(format('<img src="{0}" style="position:absolute; top: 0; left: 0; visibility: {2}" class="queue-{1}">', q.src, i, (i==0 ? 'visible' : 'hidden')));
        }
        
        queue_loaded = 0;
        
        setTimeout(function() {

          queue_loaded = queue_loaded >= queue.length ? 0 : queue_loaded;
          var q = queue[queue_loaded];
          var q2 = queue_loaded+1 >= queue.length ? queue[0] : queue[queue_loaded+1];
          
          var callee=arguments.callee;  
              
          $this.find('.queue-'+q['id']).animate({opacity:0}, q2['fade'] * 1000, function() {
            $this.find('.queue-'+q['id']).css({visibility: 'hidden', display: 'none'});
          });
            
          $this.find('.queue-'+q2['id']).css({opacity:0, visibility:'visible', display: ''}).animate({opacity: 1}, q2['fade'] * 1000, function() {
            queue_loaded++;
            setTimeout(callee, q2['sleep'] * 1000);
          });
          
          
        }, conf['sleep'] * 1000);
        
      };
      
      (function() {
        if (queue_loaded == queue.length) 
          return proceed();
        
        var callee=arguments.callee;
        var img=new Image();
        img.onload=function(){ queue_loaded++; setTimeout(callee, 10);};
        img.src=queue[queue_loaded]['src'];
      })();
          
    
    return self;
  };

})(jQuery);