if (typeof Effect == 'undefined')
    throw ("You must have the script.aculo.us library to use this accordion"); var Accordion = Class.create({ initialize: function(id, defaultExpandedCount) {
        if (!$(id)) throw ("Attempted to initalize accordion with id: " + id + " which was not found."); this.accordion = $(id); this.options = { toggleClass: "accordion-toggle", toggleActive: "accordion-toggle-active", contentClass: "accordion-content" }
        this.contents = this.accordion.select('div.' + this.options.contentClass); this.isAnimating = false; this.maxHeight = 0; this.current = defaultExpandedCount ? this.contents[defaultExpandedCount - 1] : this.contents[0]; this.toExpand = null; this.checkMaxHeight(); this.initialHide(); this.attachInitialMaxHeight(); var clickHandler = this.clickHandler.bindAsEventListener(this); this.accordion.observe('click', clickHandler);
    }, expand: function(el) { this.toExpand = el.next('div.' + this.options.contentClass); if (this.current != this.toExpand) { this.toExpand.show(); this.animate(); } }, checkMaxHeight: function() { for (var i = 0; i < this.contents.length; i++) { if (this.contents[i].getHeight() > this.maxHeight) { this.maxHeight = this.contents[i].getHeight(); } } }, attachInitialMaxHeight: function() { this.current.previous('div.' + this.options.toggleClass).addClassName(this.options.toggleActive); if (this.current.getHeight() != this.maxHeight) this.current.setStyle({ height: this.maxHeight + "px" }); }, clickHandler: function(e) { var el = e.element(); if (el.hasClassName(this.options.toggleClass) && !this.isAnimating) { this.expand(el); } }, initialHide: function() { for (var i = 0; i < this.contents.length; i++) { if (this.contents[i] != this.current) { this.contents[i].hide(); this.contents[i].setStyle({ height: 0 }); } } }, animate: function() { var effects = new Array(); var options = { sync: true, scaleFrom: 0, scaleContent: false, transition: Effect.Transitions.sinoidal, scaleMode: { originalHeight: this.maxHeight, originalWidth: this.accordion.getWidth() }, scaleX: false, scaleY: true }; effects.push(new Effect.Scale(this.toExpand, 100, options)); options = { sync: true, scaleContent: false, transition: Effect.Transitions.sinoidal, scaleX: false, scaleY: true }; effects.push(new Effect.Scale(this.current, 0, options)); var myDuration = 0.75; new Effect.Parallel(effects, { duration: myDuration, fps: 35, queue: { position: 'end', scope: 'accordion' }, beforeStart: function() { this.isAnimating = true; this.current.previous('div.' + this.options.toggleClass).removeClassName(this.options.toggleActive); this.toExpand.previous('div.' + this.options.toggleClass).addClassName(this.options.toggleActive); } .bind(this), afterFinish: function() { this.current.hide(); this.toExpand.setStyle({ height: this.maxHeight + "px" }); this.current = this.toExpand; this.isAnimating = false; } .bind(this) }); } 
    });