// dgn.de - Akkordeon-Effekt (mit script.aculo.us/prototype) // -------------------------------------------------------------- // (c) 2008 DGN Service GmbH // Version: 0.1 - Peter Rosellen, 2008-07-31 // -------------------------------------------------------------- var Accordion = Class.create(); Accordion.prototype = { initialize: function(container, options) { if (!$(container)) { throw("Der Container "+container+" existiert nicht"); return false; } this.options = Object.extend({ resizeSpeed : 8, classNames : { toggle : 'accordion_toggle', toggleActive : 'accordion_toggle_active', content : 'accordion_content' }, defaultSize : { height : null, width : null }, onEvent : 'click' }, options || {}); // Greift sich alle Elemente mit dem Toggle-Klassennamen, die innerhalb von "container" // liegen und fügt jedem einen Event hinzu, der "action" ausführt. var togglers = $$('#'+container+' .'+this.options.classNames.toggle); togglers.each(function(toggler, index) { Event.observe(toggler, this.options.onEvent, this.action.bind(this, toggler), false); if (this.options.onEvent == 'click') { toggler.onclick = function() {return false;}; } // Nur das erste Akkordeon-Element ist beim Laden sichtbar, alle anderen bekommen "display: none" // Das Toggle-Element bekommt den Zustand "active" if(index > 0) { $(toggler.next(0)).setStyle({display: 'none'}); } else { toggler.addClassName(this.options.classNames.toggleActive); } }.bind(this)); }, action: function(toggler) { //if (this.animating) { return false; } // Kann man anschalten, wenn vor dem Start der nächsten Aktion die vorherige beendet sein soll this.accordion = $(toggler.next(0)); // Aufklappen if(this.accordion.visible() != true) { new Effect.SlideDown(this.accordion, { beforeStart: function() { toggler.addClassName(this.options.classNames.toggleActive); this.animating = true; }.bind(this), afterFinish: function() { this.animating = false; }.bind(this) }); } // Zuklappen else { new Effect.SlideUp(this.accordion, { beforeStart: function() { this.animating = true; }.bind(this), afterFinish: function() { this.animating = false; toggler.removeClassName(this.options.classNames.toggleActive); }.bind(this) }); } } } Effect.Accordion = Accordion;