var Accordion = Class.create();

Accordion.prototype = {
  container_class: 'accordion',
  toggle_class: 'accordion_toggle',
  active_class: 'accordion_active',
  root: null,
  
  initialize: function(options) {
    Object.extend(this, options || { } );
    var accordions = $$('.'+this.container_class);
    accordions.each(this.setup.bind(this));
  },
  
  setup: function(accordion) {
    var acc = Object.clone(this);

    //1-1 relationship between an object and its view
    acc.root  = accordion;
    Object.extend(accordion, { accordion_object: acc});
    
    var toggles = accordion.select('.'+acc.toggle_class);
    $A(toggles).invoke('observe', 'click', acc._handle.bind(acc), false);
  },
  
  _handle: function(evt) {
    var toggle = evt.element().hasClassName(this.toggle_class) ? evt.element() : evt.element().up(this.toggle_class);
    var contents = toggle.next(0);
    if(contents.visible())
      this._deactivate(toggle);
    else
      this._activate(toggle);
  },
  
  _deactivate: function(toggle) {
    new Effect.BlindUp(toggle.next(0), {
      duration: 0.2,
      afterFinish: function(){
        toggle.removeClassName(this.active_class);
      }.bind(this),
        queue: {
          scope: 'accordion_animation',
          position: 'start'
        }
    });
  },
  
  getActive: function(el) {
    return this.root.down('.'+this.active_class);
  },
  
  _activate: function(toggle) {
    if(toggle != this.getActive())
    {
      this.closeActive();
      new Effect.BlindDown(toggle.next(0), {
        duration: 0.4,
        afterFinish: function(){
          toggle.next(0).setStyle({height: 'auto'});
          toggle.addClassName(this.active_class);
        }.bind(this),
        queue: {
          scope: 'accordion_animation',
          position: 'end'
        }
      });
    }
  },
  
  closeActive: function() {
    var active_accordion = this.getActive();
    if(!Object.isUndefined(active_accordion))
      this._deactivate(active_accordion);
  },
  
  openByName: function(name) {
    this.root.select("."+this.toggle_class).each(function(elt){
      var value = name;
      var toggle_value = elt.firstChild.data;
      if(toggle_value == value)
      {
        this._activate(elt);
      }
    }.bind(this));
  }
  
};
