// accordion.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
// 
// Accordion is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
//   Be a pro: 
//	    http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//

/*-----------------------------------------------------------------------------------------------*/

if (typeof Effect == 'undefined')
	throw ("accordion.js requires including script.aculo.us' effects.js library!");


function addLoadEvent(
		func) {
	var oldonload =
		window.onload;
	if (typeof window.onload != 'function') {
		window.onload =
			func;
	}
	else {
		window.onload =
			function() {
				if (oldonload) {
					oldonload();
				}
				func();
			}
	}
}

addLoadEvent(loadAccordions);
addLoadEvent(function() {


});

function loadAccordions() {


	var topAccordion =
		new accordion(
				'vertical_container',
				{
					classNames : {
						toggle : 'accordion_toggle',
						toggleActive : 'accordion_toggle_active',
						content : 'accordion_content'
					},
					defaultSize : {
						width : 506
					},
					direction : 'vertical'
				});
}

var accordion =
	Class.create();
accordion.prototype =
	{
		
		//
		// Setup the Variables
		//
		showAccordion : null,
		currentAccordion : null,
		duration : null,
		effects : [],
		animating : false,
		
		//  
		// Initialize the accordions
		//
		initialize : function(
				container, options) {


			if (!$(container)) {
				throw (container + " doesn't exist!");
				return false;
			}
			
			this.options =
				Object
						.extend(
								{
									resizeSpeed : 8,
									classNames : {
										toggle : 'accordion_toggle',
										toggleActive : 'accordion_toggle_active',
										content : 'accordion_content'
									},
									defaultSize : {
										height : null,
										width : null
									},
									direction : 'horizontal',
									onEvent : 'click'
								}, options
									|| {});
			
			this.duration =
				((11 - this.options.resizeSpeed) * 0.15);
			
			var accordions =
				$$('#'
					+ container + ' .'
					+ this.options.classNames.toggle);
			accordions
					.each(function(
							accordion) {


						Event.observe(
								accordion,
								this.options.onEvent,
								this.activate.bind(
										this, accordion),
								false);
						if (this.options.onEvent == 'click') {
							accordion.onclick =
								function() {


									return false;
								};
						}
						
						if (this.options.direction == 'horizontal') {
							var options =
								$H( {
									width : '0px'
								});
						}
						else {
							var options =
								$H( {
									height : '0px'
								});
						}
						options.merge( {
							display : 'none'
						});
						
						this.currentAccordion =
							$(
									accordion.next(0))
									.setStyle(
											options);
					}.bind(this));
		},
		
		//
		// Activate an accordion
		//
		activate : function(
				accordion) {


			if (this.animating) {
				return false;
			}
			
			this.effects =
				[];
			
			this.currentAccordion =
				$(accordion.next(0));
			this.currentAccordion.setStyle( {
				display : 'block'
			});
			
			this.currentAccordion.previous(
					0).addClassName(
					this.options.classNames.toggleActive);
			
			if (this.options.direction == 'horizontal') {
				this.scaling =
					$H( {
						scaleX : true,
						scaleY : false
					});
			}
			else {
				this.scaling =
					$H( {
						scaleX : false,
						scaleY : true
					});
			}
			
			if (this.currentAccordion == this.showAccordion) {
				this.deactivate();
			}
			else {
				this._handleAccordion();
			}
		},
		// 
		// Deactivate an active accordion
		//
		deactivate : function() {


			var options =
				$H( {
					duration : this.duration,
					scaleContent : false,
					transition : Effect.Transitions.sinoidal,
					queue : {
						position : 'end',
						scope : 'accordionAnimation'
					},
					scaleMode : {
						originalHeight : this.options.defaultSize.height
							? this.options.defaultSize.height
							: this.currentAccordion.scrollHeight,
						originalWidth : this.options.defaultSize.width
							? this.options.defaultSize.width
							: this.currentAccordion.scrollWidth
					},
					afterFinish : function() {


						this.showAccordion.setStyle( {
							height : 'auto',
							display : 'none'
						});
						this.showAccordion =
							null;
						this.animating =
							false;
					}.bind(this)
				});
			options.merge(this.scaling);
			
			this.showAccordion.previous(
					0).removeClassName(
					this.options.classNames.toggleActive);
			
			new Effect.Scale(
					this.showAccordion, 0, options);
		},
		
		//
		// Handle the open/close actions of the accordion
		//
		_handleAccordion : function() {


			var options =
				$H( {
					sync : true,
					scaleFrom : 0,
					scaleContent : false,
					transition : Effect.Transitions.sinoidal,
					scaleMode : {
						originalHeight : this.options.defaultSize.height
							? this.options.defaultSize.height
							: this.currentAccordion.scrollHeight,
						originalWidth : this.options.defaultSize.width
							? this.options.defaultSize.width
							: this.currentAccordion.scrollWidth
					}
				});
			options.merge(this.scaling);
			
			this.effects.push(new Effect.Scale(
					this.currentAccordion, 100, options));
			
			if (this.showAccordion) {
				this.showAccordion
						.previous(
								0)
						.removeClassName(
								this.options.classNames.toggleActive);
				
				options =
					$H( {
						sync : true,
						scaleContent : false,
						transition : Effect.Transitions.sinoidal
					});
				options.merge(this.scaling);
				
				this.effects.push(new Effect.Scale(
						this.showAccordion, 0, options));
			}
			
			new Effect.Parallel(
					this.effects,
					{
						duration : this.duration,
						queue : {
							position : 'end',
							scope : 'accordionAnimation'
						},
						beforeStart : function() {


							this.animating =
								true;
						}.bind(this),
						afterFinish : function() {


							if (this.showAccordion) {
								this.showAccordion
										.setStyle( {
											display : 'none'
										});
							}
							$(
									this.currentAccordion)
									.setStyle(
											{
												height : 'auto'
											});
							this.showAccordion =
								this.currentAccordion;
							this.animating =
								false;
						}.bind(this)
					});
		}
	}

