
if (typeof Effect == 'undefined') 
  throw("accordion.js requires including script.aculo.us' effects.js library!");

var accordion = Class.create();
accordion.prototype = {

  //
  //  Setup the Variables
  //
  showAccordion : null,
  currentAccordion : null,
  duration : null,
  effects : [],
  animating : false,
  
  //  
  //  Initialize the accordions
  //
  initialize: function(container, options) {
    if (!$(container)) {
      throw(container+" doesn't exist!");
      return false;
    }
    
    this.options = Object.extend({
      resizeSpeed : 8,
      classNames : {
        toggle : 'accordion-toggle',
        toggleActive : 'accordion-toggle-active',
        content : 'accordion-content'
      },
      defaultSize : {
        height : null,
        width : null
      },
      direction : 'vertical',
      onEvent : 'click'
    }, options || {});
    
    this.duration = ((11-this.options.resizeSpeed)*0.15);

    var accordions = $$('#'+container+' .'+this.options.classNames.toggle);
    accordions.each(function(accordion) {
      Event.observe(accordion, this.options.onEvent, this.activate.bind(this, accordion), false);
      if (this.options.onEvent == 'click') {
        accordion.onclick = function() {return false;};
      }
      
      if (this.options.direction == 'horizontal') {
        var options = {width: '0px', display:'none'};
      } else {
        var options = {height: '0px', display:'none'};
      }
//      options.merge({display: 'none'});     
      
      this.currentAccordion = $(accordion.next(0)).setStyle(options);
    }.bind(this));
  },
  
  //
  //  Activate an accordion
  //
  activate : function(accordion) {
    if (this.animating) {
      return false;
    }
    
    this.effects = [];
  
    this.currentAccordion = $(accordion.next(0));
    this.currentAccordion.setStyle({
      display: 'block'
    });   
    
    this.currentAccordion.previous(0).addClassName(this.options.classNames.toggleActive);

    if (this.options.direction == 'horizontal') {
      this.scaling = $H({
        scaleX: true,
        scaleY: false
      });
    } else {
      this.scaling = $H({
        scaleX: false,
        scaleY: true
      });     
    }
      
    if (this.currentAccordion == this.showAccordion) {
      this.deactivate();
    } else {
      this._handleAccordion();
    }
  },
  // 
  // Deactivate an active accordion
  //
  deactivate : function() {
    var options = $H({
      duration: this.duration,
      scaleContent: false,
      transition: Effect.Transitions.sinoidal,
      queue: {
        position: 'end', 
        scope: 'accordionAnimation'
      },
      scaleMode: { 
        originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
        originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
      },
      afterFinish: function() {
        this.showAccordion.setStyle({
          height: 'auto',
          display: 'none'
        });       
        this.showAccordion = null;
        this.animating = false;
      }.bind(this)
    });    
//    options.merge(this.scaling);

    this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
    
    new Effect.Scale(this.showAccordion, 0, options.update(this.scaling).toObject());
  },

  //
  // Handle the open/close actions of the accordion
  //
  _handleAccordion : function() {
    var options = $H({
      sync: true,
      scaleFrom: 0,
      scaleContent: false,
      transition: Effect.Transitions.sinoidal,
      scaleMode: { 
        originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
        originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
      }
    });
    options.merge(this.scaling);
    
    this.effects.push(
      new Effect.Scale(this.currentAccordion, 100, options.update(this.scaling).toObject())
    );

    if (this.showAccordion) {
      this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
      
      options = $H({
        sync: true,
        scaleContent: false,
        transition: Effect.Transitions.sinoidal
      });
      options.merge(this.scaling);
      
      this.effects.push(
        new Effect.Scale(this.showAccordion, 0, options.update(this.scaling).toObject())
      );        
    }
    
    new Effect.Parallel(this.effects, {
      duration: this.duration, 
      queue: {
        position: 'end', 
        scope: 'accordionAnimation'
      },
      beforeStart: function() {
        this.animating = true;
      }.bind(this),
      afterFinish: function() {
        if (this.showAccordion) {
          this.showAccordion.setStyle({
            display: 'none'
          });       
        }
        $(this.currentAccordion).setStyle({
          height: 'auto'
        });
        this.showAccordion = this.currentAccordion;
        this.animating = false;
      }.bind(this)
    });
  }
}

// ---------------

function setupAccordions() {
  var accordions = $$('.vertical-accordion');
  var i;
  for(i=0; i<accordions.length; i++)
  {
    var id = $(accordions[i]).id;
    var acc = new accordion(id);
    //acc.activate($$('#'+(id)+' .accordion-toggle')[0]);
  }
}
    
Event.observe(window, 'load', setupAccordions, false);
