var AccordionMod = Fx.Elements.extend({
	options: {
		onActive: Class.empty,
		onBackground: Class.empty,
		display: 0,
		show: false,
		height: true,
		width: false,
		opacity: true,
		fixedHeight: false,
		fixedWidth: false,
		wait: false,
		alwaysHide: false
	},
	initialize: function(){
		var options, togglers, elements, container;
		$each(arguments, function(argument, i){
			switch($type(argument)){
				case 'object': options = argument; break;
				case 'element': container = $(argument); break;
				default:
					var temp = $$(argument);
					if (!togglers) togglers = temp;
					else elements = temp;
			}
		});
		this.togglers = togglers || [];
		this.elements = elements || [];
		this.container = $(container);
		this.setOptions(options);
		this.previous = -1;
		this.curIndex = -1;
		if (this.options.alwaysHide) this.options.wait = true;
		if ($chk(this.options.show)){
			this.options.display = false;
			this.previous = this.options.show;
		}
		if (this.options.start){
			this.options.display = false;
			this.options.show = false;
		}
		this.effects = {};
		if (this.options.opacity) this.effects.opacity = 'fullOpacity';
		if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth';
		if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight';
		for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]);
		this.elements.each(function(el, i){
			if (this.options.show === i){
				this.fireEvent('onActive', [this.togglers[i], el]);
			} else {
				for (var fx in this.effects) el.setStyle(fx, 0);
			}
		}, this);
		this.parent(this.elements);
		if ($chk(this.options.display)) this.display(this.options.display);
	},

	addSection: function(toggler, element, pos){
		toggler = $(toggler);
		element = $(element);
		var test = this.togglers.contains(toggler);
		var len = this.togglers.length;
		this.togglers.include(toggler);
		this.elements.include(element);
		if (len && (!test || pos)){
			pos = $pick(pos, len - 1);
			toggler.injectBefore(this.togglers[pos]);
			element.injectAfter(toggler);
		} else if (this.container && !test){
			toggler.inject(this.container);
			element.inject(this.container);
		}
		var idx = this.togglers.indexOf(toggler);
		toggler.addEvent('mouseenter', this.display.bind(this, idx));
		if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
		if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
		element.fullOpacity = 1;
		if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth;
		if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight;
		element.setStyle('overflow', 'hidden');
		if (!test){
			for (var fx in this.effects) element.setStyle(fx, 0);
		}
		return this;
	},

	display: function ( index ) {
		this.curIndex = index;
		return ( function ( ) {
		if ( this.curIndex === index ) {
			index = ( $type ( index ) == 'element' ) ? this.elements.indexOf ( index ) : index;
			if ( ( this.timer && this.options.wait ) || ( index === this.previous && !this.options.alwaysHide ) ) return this;
			this.previous = index;
			var obj = { };
			this.elements.each ( function ( el, i ) {
				obj[i] = { };
				var hide = ( i != index ) || (this.options.alwaysHide && (el.offsetHeight > 0));
				this.fireEvent(hide ? 'onBackground' : 'onActive', [this.togglers[i], el]);
				for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
			}, this);
			return this.start(obj); 
		} else {
			return this;
		} }.bind ( this ) ).delay( 250 );
	},
	showThisHideOpen: function(index){return this.display(index);}
});



var accordions = {
	init: function(){
		var accordionblocks = $$('.accordion');
		accordionblocks.each(function(block){
			var items = block.getElements('.bottom');
			var items2 = block.getElements('.close');
			
			var i = 800;
			items2.each(function(item){
				item.setStyle('z-index',--i);
			});
			i = 800;
			items.each(function(item){
				item.setStyle('z-index',--i);
			});
			
			var activeDisplay = 0;
			var activeDisplayCounter = 0;
			
			block.getElements('div.atStart .activeSelector').each(function(aselement){
				if(aselement.getText() == '1'){
					activeDisplay = activeDisplayCounter;
					activeDisplayCounter ++;
				} else {
					activeDisplayCounter ++;
				}
			});
			
			var accordion = new AccordionMod(block.getElements('.toggler'), block.getElements('.element'), {
				opacity: false,
				duration: 200,
				display: activeDisplay,
				onActive: function(toggler, element){
					element.getParent().addClass('bottom_active');
					element.getParent().getNext().addClass('close_active');
				},
				onBackground: function(toggler, element){
					element.getParent().removeClass('bottom_active');
					element.getParent().getNext().removeClass('close_active');
				}
			}, block);
		});
	}
}