(function($){
$.fn.Banner = function(vars) {
  vars = vars || {};
  var $slider     = $(this);
  var timeout     = vars.timeout || vars.timeOut || 10000;
  var fadeTime    = vars.fadeTime || 100;
  var current     = 0;
  var items       = $(".slide", $slider);
  var spanOpacity = vars.spanOpacity || 0.7;

  function visible(item){
    return $(item).css('display')!='none';
  }

  function slide(){
    var item = $(items[current]);
    var span = $('span',item);
    var span_is_blank = !span.html() ||  /^\s*$/.test(span.html());
    if(span_is_blank){span.hide();span = $('<span>')};
    if(visible(item)) {
      fadeOut(item,span);
      current = (current + 1) % items.length;
    } else {
      span.hide();
      fadeIn(item,span);
    }
  }

  function setSlideTimeout(time) {
    setTimeout(trySlide, time);
  }

  function trySlide(){
      slide();
  }

  function fadeIn(item,span){
    item.fadeIn(fadeTime, function() {
      //normally fadeIn would be sufficient, but IEs need explicit opacity value [mcritchlow]
      span.css("opacity",0).show().fadeTo(fadeTime,spanOpacity,function(){
        setSlideTimeout(timeout);//=> wait ...
      })
    })
  }

  function fadeOut(item,span){
    span.fadeOut('slow',function(){
      item.fadeOut(fadeTime,function(){
        slide();//=> fadeIn
      })
    })
  }

  //GO!
  $('span',items[0]).css('opacity',spanOpacity); //set initial opacity
  setSlideTimeout(visible(items[0]) ? timeout : 0); //start sliding
};
})(jQuery);  
