// Requires effects.js

function Shader(label, options) {
  if (!options) options = {}
  this.label = $(label)
  this.label.shader = this
  if (this.target = $(this.label.readAttribute('for'))) {
    if (options.shaded) this.target.setStyle({ display: 'none' })
    this.target.shader = this
    this.label.observe('click', Shader.clickHandler)
    this.label.setStyle({ cursor: 'pointer' })
    for (var cb in Shader.callbacks) {
      this[Shader.callbacks[cb]] = options[Shader.callbacks[cb]] || Shader.nilCallback
    }
  }
}

Shader.callbacks = ['beforeShade', 'afterShade', 'beforeUnshade', 'afterUnshade']
Shader.nilCallback = function(shader) {}

Shader.clickHandler = function(event) {
  var shader = event.element().shader
  if (!shader.inEffect) {
    shader.inEffect = true
    if (shader.shaded()) {
      shader.beforeUnshade(shader)
      Effect.SlideDown(shader.target, { afterFinish: Shader.finished })
    } else {
      shader.beforeShade(shader)
      Effect.SlideUp(shader.target, { afterFinish: Shader.finished })
    }
  }
}

Shader.finished = function(effect) {
  var shader = effect.element.shader
  if (shader.shaded()) {
    shader.afterShade(shader)
  } else {
    shader.afterUnshade(shader)
  }
  shader.inEffect = false
}


Shader.prototype.shaded = function() {
  return !this.target.visible()
}

