// accordion.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
// 
// Accordion is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
//   Be a pro: 
//      http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//

/*-----------------------------------------------------------------------------------------------*/

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)
    });
  }
}