YAHOO.util.Event.onDOMReady(function() {
  
  var Dom = YAHOO.util.Dom;
  var Evt = YAHOO.util.Event;
  var Ani = YAHOO.util.Anim;
  
  var slides = Dom.getChildren("marquee-slides");
  var tabs = Dom.getChildren("marquee-toggler");
  var labels = [];
  
  var windowHeight = parseInt(Dom.getStyle("marquee", "height"));
  var windowWidth = parseInt(Dom.getStyle("marquee", "width"));
  
  var slideDuration = 4000;
  var slideTransition = 300;
  var labelTransition = 300;
  
  var easingFn = YAHOO.util.Easing.easeBoth;
  
  slideTransition /= 1000;
  labelTransition /= 1000;
  for (var i=0; i<slides.length; i++) {
    labels[i] = Dom.getElementsByClassName("marquee-label", null, slides[i]);
    labels[i] = labels[i].length ? labels[i][0] : null;
    if (labels[i]) {
      var region = Dom.getRegion(labels[i]);
      labels[i].height = region.bottom-region.top;
    }
  }
  
  var toggleLabel = function(label, show, callback) {
    if (!label) {
      if (callback) callback();
    } else {
      var offset = show ? windowHeight-label.height : windowHeight;
      var animLabel = new Ani(label, {top: {to: offset}}, labelTransition, easingFn);
      if (callback) animLabel.onComplete.subscribe(callback, this);
      animLabel.animate();
    }
  }
  
  var changeSlide = function(nextSlide) {
    if (nextSlide === true) {
      nextSlide = (currentSlide == tabs.length-1) ? 0 : currentSlide+1;
    } else if (slideShow) {
      clearTimeout(slideShow);
      slideShow = false;
    }
    if (nextSlide != currentSlide) {
      var distance = Math.abs(nextSlide-currentSlide);
      toggleLabel(labels[currentSlide], false, function() {
        Dom.removeClass(tabs[currentSlide], "current");
        currentSlide = nextSlide;
        Dom.addClass(tabs[currentSlide], "current");
        var animSlide = new Ani("marquee-slides", {left: {to: -windowWidth*currentSlide}}, slideTransition*distance, easingFn);
        animSlide.onComplete.subscribe(function() {
          toggleLabel(labels[currentSlide], true);
          if (slideShow) slideShow = setTimeout(function() {changeSlide(true);}, slideDuration);
        }, this);
        animSlide.animate();
      });
    }
  }
  
  if (tabs.length) {
    var currentSlide = 0;
    var slideShow = setTimeout(function() {changeSlide(true);}, slideDuration);
  }
  
  for (var i=0; i<tabs.length; i++) {
    Evt.addListener(Dom.getFirstChild(tabs[i]), "click", function(e) {
      Evt.preventDefault(e);
      changeSlide(Evt.getTarget(e).innerHTML-1);
    }, this);
  }
});