if(Amslib.UI == "undefined")
	throw "Amslib.UI.Accordion requires Amslib.UI to be loaded.";

Amslib.UI.Accordion = Class.create(Amslib.UI,
{
	animating:	false,
	accordion:	false,
	openBlock:	false,
	callback:	false,
	
	initialize: function($super,accordion)
	{
		$super();
		
		this.accordion = accordion;
		this.accordion.store(Amslib.UI.Accordion.config.nodeStorage,this);
		this.accordion.select("."+Amslib.UI.Accordion.config.title).each(function(title){
			title.observe("click",this.click.bind(this));
		}.bind(this));
		
		this.openBlock = this.accordion.down("."+Amslib.UI.Accordion.config.css.open);
		this.animating = false;

		//	Set the default callback
		this.callback = new Hash();
		this.observe("click",function(){});
		this.observe("afterOpen",function(){});
		this.observe("afterClose",function(){});
		this.observe("afterFinish",function(){});
	},
	
	click: function(event)
	{
		if(!this.animating){
			var element = event.element();
			
			if(!element.hasClassName(Amslib.UI.Accordion.config.title)){
				element = element.up("."+Amslib.UI.Accordion.config.title);
			}
			
			if(!element) return;
			
			if(element.hasClassName(Amslib.UI.Accordion.config.css.open)){
				if(this.openBlock) this.close(element);
				this.openBlock = false;
			}else{
				this.callback.get("click")(this.openBlock,element);
				
				if(this.openBlock) this.close(this.openBlock);
				this.openBlock = element;
				
				this.open(element);
			}
		}
		
		event.stop();
		return false;
	},
	
	open: function(element)
	{
		this.animating = true;
		
		element.removeClassName(Amslib.UI.Accordion.config.css.close);
		element.addClassName(Amslib.UI.Accordion.config.css.open);
		
		var content = element.next("."+Amslib.UI.Accordion.config.content);
		
		if(content) content.blindDown({
			duration: Amslib.UI.Accordion.config.duration,
			afterFinish: function(){
				this.animating = false;
				this.callback.get("afterOpen")(this.openBlock,element);
				this.callback.get("afterFinish")(this.openBlock,element);
			}.bind(this)
		});
	},
	
	close: function(element)
	{
		this.animating = true;
		
		element.addClassName(Amslib.UI.Accordion.config.css.close);
		element.removeClassName(Amslib.UI.Accordion.config.css.open);
		
		var content = element.next("."+Amslib.UI.Accordion.config.content);
		
		if(content) content.blindUp({
			duration: Amslib.UI.Accordion.config.duration,
			afterFinish: function(){
				this.animating = false;
				this.callback.get("afterClose")(this.openBlock,element);
				this.callback.get("afterFinish")(this.openBlock,element);
			}.bind(this)
		});
	},
	
	observe: function(handle,callback)
	{
		this.callback.set(handle,callback);
	}
});

Amslib.UI.Accordion.config = {
	auto:			"amslib_ui_accordion_auto",
	title:			"amslib_ui_accordion_title",
	content:		"amslib_ui_accordion_content",
	nodeStorage:	"amslib_ui_accordion",
	css:{
		open:		"amslib_ui_accordion_open",
		close:		"amslib_ui_accordion_close"
	},
	duration:		0.5
}

Amslib.UI.Accordion.autoload = function(){
	$$("."+Amslib.UI.Accordion.config.auto).each(function(a){
		if(!a.retrieve(Amslib.UI.Accordion.config.nodeStorage)){
			var accordion = new Amslib.UI.Accordion(a);
		}
	});
}

Event.observe(window,"load",Amslib.UI.Accordion.autoload);
