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