
/* Based on a Accordion Class by Jason McCreary */

Accordion = Class.create({
	initialize: function(element, options){
		this.element = $(element);
		this.options = Object.extend({
			enabled: true,
			activeClass: 'active'
		}, options || { });
		
		if(this.options.enabled) {
			this.descriptionElements = this.element.select('dd');
			this.openElement = null;
			this.isAnimating = false;
			this.startAccordion();
		}
	},
	addObservers: function(){
		this.element.observe('click', Event.delegate(this.delegates.click).bindAsEventListener(this));
	},
	delegates: {
		click: {
			'dt a': function(e) {
				var me = e.findElement('a').up('dt').next('dd');
				e.stop();
				if(!this.isAnimating && me) {
					this.toggleElement(me);
				}
				return false;
			}
		}
	},
	startAccordion: function(){
		this.descriptionElements.each(function(e) {
			e.setStyle({height: 0});
		});
		this.addObservers();
		this.toggleElement(this.descriptionElements.first());
	},
	toggleElement: function(element) {
		var effects = [];
		var options = {};
		/*
		if (element == this.openElement) {
			return;
		}
		*/
		if(!this.openElement || this.openElement != element) {
			var options = {
				sync: true,
				scaleFrom: 0,
				scaleContent: false,
				scaleMode: 'contents',
				scaleX: false,
				scaleY: true
			};
			effects.push(new Effect.Scale(element, 100, options));
		}
		if(this.openElement) {
			var options = {
				sync: true,
				scaleContent: false,
				scaleX: false,
				scaleY: true
			};
			effects.push(new Effect.Scale(this.openElement, 0, options));
		}
		
		new Effect.Parallel(effects, {
			duration: 0.5,
			fps: 25,
			queue: {
				position: 'end',
				scope: 'accordion'
			},
			beforeStart: function() {
				this.isAnimating = true;
				element.addClassName(this.options.activeClass);
				element.previous('dt').addClassName(this.options.activeClass);
			}.bind(this),
			afterFinish: function() {
				if (this.openElement) {
					this.openElement.removeClassName(this.options.activeClass);
					this.openElement.previous('dt').removeClassName(this.options.activeClass);
				}
				if (this.openElement == element) {
					this.openElement = null;
				} else {
					this.openElement = element;
				}
				this.isAnimating = false;
			}.bind(this)
		});
	}
});	
