jQuery.fn.nextUntil = function(expr) { var match = []; this.each(function(){ for( var i = this.nextSibling; i; i = i.nextSibling ) { if ( i.nodeType != 1 ) continue; if ( jQuery.filter( expr, [i] ).r.length ) break; match.push( i );}
}); return this.pushStack( match, arguments );}; (function($) { var plugin = $.fn.Accordion = function(settings) { settings = $.extend($.extend({}, arguments.callee.defaults), $.extend({ header: $(':first-child', this)[0].tagName
}, settings || {})); var container = this, active = settings.active ? $(settings.active, this) : settings.active === false ? $("<div>") : $(settings.header, this).eq(0), running = 0; $(settings.header, container)
.not(active && active[0] || "")
.nextUntil(settings.header)
.hide(); active.addClass(settings.selectedClass); var clickHandler = function(event) { var clicked = $(event.target); if(running || clicked[0] == active[0] || !clicked.is(settings.header))
return; active.removeClass(settings.selectedClass); clicked.addClass(settings.selectedClass); var toShow = $(clicked).nextUntil(settings.header), toHide = $(active).nextUntil(settings.header), data = [clicked, active, toShow, toHide]; active = clicked; running = toHide.size() + toShow.size(); var finished = function() { if(--running)
return; toHide.css({height: ''}); toShow.css({height: ''}); container.trigger("change", data);}; toHide.slideUp(settings.hideSpeed, finished); toShow.slideDown(settings.showSpeed, finished); if(event.preventDefault)
event.preventDefault();}; var activateHandlder = function(event, index) { clickHandler({ target: $(settings.header, this)[index]
});}; return container
.bind("click", clickHandler)
.bind("activate", activateHandlder);}; plugin.defaults = { selectedClass: "selected", showSpeed: 'slow', hideSpeed: 'fast'
}; $.fn.activate = function(index) { return this.trigger('activate', [index || 0]);};})(jQuery); 