/*
 * Accordion.js v0.3 - Creates a Accordion UI element from a definition list
 *
 * AUTHOR: 	C. James Callaway <TehTreag@CyberGod.net>
 * WEBSITE:	http://www.CyberGod.net
 * DATE:   	Wed Sep 12 00:23:16 CDT 2007
 *
 * LICENSE:	This work is licensed under a Creative Commons
 *		Attribution 3.0 License
 *		http://creativecommons.org/licenses/by/3.0/
 *
 *------------------------------------------------------------------------
 *
 */
Accordion = Class.create();
Accordion.prototype = {
    initialize: function(elem) {
	this.options = Object.extend({
	      activeElement: null,
	      activeIndex: 1,
	      independent: false,
	      effect: 'blind',
	      duration: 0.2,
	      activeClassName: 'active',
	      onActivate: null
	    }, arguments[1] || {});
	var children = $$('#' + elem + ' > dt');
	children.invoke('observe','click', this._ABE.bindAsEventListener(this))
		.invoke('setStyle',{cursor:'pointer'})
		.invoke('next')
		.invoke('hide');
	this.activePanel = (this.options.activeElement)
		? $(this.options.activeElement)
		: children[this.options.activeIndex - 1];

	if (!this.options.independent) {
	    this.activePanel.setStyle({cursor:'default'});
	}
	this.activePanel.isOpen = true;
	this.activePanel.addClassName(this.options.activeClassName);
	var contentElement = Element.next(this.activePanel);
	Element.show(contentElement);
	Element.addClassName(contentElement,this.options.activeClassName);
    },
    _ABE: function(event) { // activateByEvent
	this.activate(Event.element(event));
    },
    activate: function(panel) {
	var panel = $(panel);
	while (panel.nodeName != 'DT') {
	    panel = panel.up();
	}
	if (this.options.onActivate && !this.options.onActivate(panel)) {
	    return;
	}
	if (this.options.independent) {
	    if (!panel.isOpen) {
		panel.addClassName(this.options.activeClassName);
		panel.next().addClassName(this.options.activeClassName);
		new Effect.BlindDown(panel.next(),{duration: this.options.duration});
	    } else {
		new Effect.BlindUp(panel.next(),{duration: this.options.duration});
		panel.removeClassName(this.options.activeClassName);
		panel.next().removeClassName(this.options.activeClassName);
	    }
	    panel.isOpen = !panel.isOpen;
	} else if(panel != this.activePanel) {
	    if (this.options.effect == 'blind') {
		new Effect.Parallel (
		    [
			new Effect.BlindUp(this.activePanel.next()),
			new Effect.BlindDown(panel.next())
			], {duration: this.options.duration});
	    } else if (this.options.effect == 'slide') {
		new Effect.Parallel (
		    [
			new Effect.SlideUp(this.activePanel.next()),
			new Effect.SlideDown(panel.next())
			], {duration: this.options.duration});
		Element.setStyle(panel,{background_color:'blue',cursor:'pointer'})
	    } else {
		this.activePanel.next().hide();
		panel.next().show();
	    }
	    Element.setStyle(panel,{cursor:'default'})
	    Element.setStyle(this.activePanel,{cursor:'pointer'})

	    panel.addClassName(this.options.activeClassName);
	    this.activePanel.removeClassName(this.options.activeClassName)
	    	.next().removeClassName(this.options.activeClassName);
	    this.activePanel = panel;
	}
	flickerTrackHandles();
	return true;
    }
}

