
jQuery.fn.extend({ 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); }, Accordion: function(settings) {
    settings = jQuery.extend({}, jQuery.Accordion.defaults, { header: jQuery(':first-child', this)[0].tagName }, settings); var container = this, active = settings.active ? jQuery(settings.active, this) : settings.active === false ? jQuery("<div>") : jQuery(settings.header, this).eq(0), running = 0; container.find(settings.header).not(active || "").nextUntil(settings.header).hide(); active.addClass(settings.selectedClass); function clickHandler(event) {
        var clicked = jQuery(event.target); if (clicked.parents(settings.header).length) { while (!clicked.is(settings.header)) { clicked = clicked.parent(); } }
        var clickedActive = clicked[0] == active[0]; if (running || (settings.alwaysOpen && clickedActive) || !clicked.is(settings.header))
            return; active.toggleClass(settings.selectedClass); if (!clickedActive) { clicked.addClass(settings.selectedClass); }
        var toShow = clicked.nextUntil(settings.header), toHide = active.nextUntil(settings.header), data = [clicked, active, toShow, toHide]; active = clickedActive ? jQuery([]) : clicked; running = toHide.size() + toShow.size(); var finished = function(cancel) {
            running = cancel ? 0 : --running; if (running)
                return; container.trigger("change", data);
        }; if (settings.animated) { if (!settings.alwaysOpen && clickedActive) { toShow.slideToggle(settings.showSpeed); finished(true); } else { toHide.filter(":hidden").each(finished).end().filter(":visible").slideUp(settings.hideSpeed, finished); toShow.slideDown(settings.showSpeed, finished); } } else {
            if (!settings.alwaysOpen && clickedActive) { toShow.toggle(); } else { toHide.hide(); toShow.show(); }
            finished(true);
        }
        return false;
    }; function activateHandlder(event, index) { clickHandler({ target: jQuery(settings.header, this)[index] }); }; return container.bind(settings.event, clickHandler).bind("activate", activateHandlder);
}, activate: function(index) { return this.trigger('activate', [index || 0]); } 
}); jQuery.Accordion = {}; jQuery.extend(jQuery.Accordion, { defaults: { selectedClass: "selected", showSpeed: 'slow', hideSpeed: 'fast', alwaysOpen: true, animated: true, event: "mouseover" }, setDefaults: function(settings) { jQuery.extend(jQuery.Accordion.defaults, settings); } });