/*
This class will make all containing divs (with a given class) give their specified child elements an accordian effect.

Use:You only need to construct the class to get it working. I.e.
new Accordion('accordion-container', 'accordion-toggle', 'accordion-content');

Using the above code will make all child elements (of elements with a class 'accordion-container'), with the class 'accordion-toggle', trigger a blind down effect on the next element, with a class of 'accordion-content'.
*/
var Accordion = Class.create({
	
	initialize: function(containerClassName, toggleClassName, contentClassName, within) {
		
		this.containerClassName = containerClassName;
		this.toggleClassName    = toggleClassName;
		this.contentClassName   = contentClassName;
		this.within             = null;
		if (within) {
			this.within = $(within);
		}
		
		var containers = this._findContainers();
		
		for (var i = 0; i < containers.length; i++) {			
			for (var j = 0; j < containers[i].toggles.length; j++) {
				containers[i].contents[j].hide();
				containers[i].toggles[j].addClassName('icn');
				containers[i].toggles[j].addClassName('closed');
				containers[i].toggles[j].observe('click', this.handleClick.bind(this, containers[i].toggles[j], containers[i].contents[j]));
			}
		}

		Event.observe(window, 'load', function() {
			if (location.hash.length > 0) {
				var hash = location.hash.substr(1);
				var finished = false;
				for (var i = 0; i < containers.length || !finished; i++) {
					for (var j = 0; j < containers[i].toggles.length || !finished; j++) {
						var id = containers[i].toggles[j].identify();
						if (id == hash) {
							this.handleClick(containers[i].toggles[j], containers[i].contents[j]);
							finished = true;
						}
					}
				}
			}
		}.bind(this));
		
	},
	
	handleClick: function(toggle, content, event) {
		toggle.toggleClassName('open');
		toggle.toggleClassName('closed');
		Effect.toggle(content.identify(), 'blind',  {duration: 0.5});
	},
	
	_findContainers: function() {
		
		if (this.within) {
			var containersWithClassName = Selector.findChildElements(this.within, ['.' + this.containerClassName]);
		} else {
			var containersWithClassName = $$('.' + this.containerClassName);
		}
		var containers = new Array();
		
		for (var i = 0; i < containersWithClassName.length; i++) {
			
			containers[i]              = new Hash();
			var containerWithClassName = $(containersWithClassName[i]);
			
			var toggles  = $A(containerWithClassName.getElementsByClassName(this.toggleClassName));
			var contents = $A(containerWithClassName.getElementsByClassName(this.contentClassName));
			
			containers[i].toggles   = toggles;
			containers[i].contents  = contents;
			containers[i].container = containerWithClassName;
			
		}
		
		return containers;
		
	}
	
});

Event.observe(document, 'layout:load:mainContent', function() {
	new Accordion('accordion-container', 'accordion-toggle', 'accordion-content', 'content');
});

Event.observe(document, 'layout:load:contentExtra', function() {
	new Accordion('accordion-container', 'accordion-toggle', 'accordion-content', 'contentExtra');
});

