function Accordion(element, config) {

  this.options = {
    toggleClass: "accordion-toggle",
    toggleActive: "accordion-toggle-active",
    contentClass: "accordion-content"
  };

  this.toggleFirst = false;
  this.container = Ext.get(element);

  this.init = function(config) {

    this.isAnimating = false;
    this.maxHeight = {};
    if (this.toggleFirst) {
      this.container.child('.' + this.options.toggleClass).addClass(this.options.toggleActive);
    }
    
    this.container.select('div.'+this.options.contentClass).each(this.initContent, this);
  };

  this.initContent = function(item, all, i) {
    item.set({maxHeight: item.getHeight() + (Ext.isIE ? 20 : 0)});
    if ((this.toggleFirst && i > 0) || !this.toggleFirst) {
      item.hide().setStyle('height', 0);
    }
    item.prev('.' + this.options.toggleClass).on('click', this.expand, this);
  };

  this.expand = function(ev, el) {
    el = Ext.get(el);

    var handler = false;
    var toExp = el.next('div.' + this.options.contentClass);
    var expand = true;
    
    if (!toExp || el.hasClass(this.options.toggleActive)) {
      expand = false;
    }
    
    if (handler = this.container.child('.' + this.options.toggleActive)) {
      handler.removeClass(this.options.toggleActive);
      handler.next('div.' + this.options.contentClass).scale(undefined, 0, {
        callback: function(el2) {
          el2.hide();
        }
      });
    }

    if (expand) {
      el.addClass(this.options.toggleActive);
      toExp.show().scale(undefined, toExp.getAttribute('maxHeight'));
    }
  };
  
  this.init(config);
};