document.observe("dom:loaded", function () {
  function block(callback) { return callback() }

  function fadeIn(element, duration, callback) {
    fade(element, 0, 1, duration, callback)
  }

  function fadeOut(element, duration, callback) {
    fade(element, 1, 0, duration, callback)
  }

  function fade(element, from, to, duration, callback) {
    element.setStyle({ opacity: from })
    new Effect.Opacity(element, {
      from: from, to: to,
      duration: duration,
      afterFinish: callback
    })
  }
  
  if ($("promo").childElements().length > 0) {
    animatePromoSlides()
  }

  if ($("partner-logos")) {
    animatePartnerLogos()
  }

  function animatePromoSlides() {
    var elements = $$("#promo aside")
    var i = 0

    hideAllSlides()
    fadeInCurrentSlide()

    function fadeInCurrentSlide() {
      getCurrentSlide().show()
      getCurrentSlide().setOpacity(0.0)

      fadeIn(getCurrentSlide(), 1.0, function () {
        setTimeout(fadeOutCurrentSlide, 8000)
      })
    }
    
    function fadeOutCurrentSlide() {
      fadeOut(getCurrentSlide(), 1.5, function () {
        getCurrentSlide().hide()
        selectNextSlide()
        fadeInCurrentSlide()
      })
    }

    function getCurrentSlide() {
      return elements[i]
    }

    function selectNextSlide() {
      i = (i + 1) % elements.length
    }

    function hideAllSlides() {
      elements.invoke("hide")
    }
  }

  function distance(a, b) {
    return Math.abs(a - b)
  }

  function animatePartnerLogos() {
    var elements = $$("#partner-logos div")
    var hiddenContainer = $("hidden")
    var lastIndex = 0
    
    switchLogo()

    function pickElement() {
      var i

      do {
        i = Math.floor(Math.random() * elements.length)
      } while (distance(lastIndex, i) < 2)

      lastIndex = i

      return elements[i]
    }

    function switchLogo() {
      var element = pickElement()
      var visibleImage = element.down("img")
      var invisibleImage = hiddenContainer.down("img")

      fadeOut(visibleImage, 0.5, function () {
        hiddenContainer.insert(visibleImage)
        element.insert(invisibleImage)

        invisibleImage.setStyle({ opacity: 0 })

        fadeIn(invisibleImage, 0.5, function () {
          setTimeout(switchLogo, 1000)
        })
      })
    }
  }
})

