﻿/*
 * Accordion 1.3 - jQuery menu widget
 *
 * Copyright (c) 2006 J�rn Zaefferer, Frank Marcia
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.accordion.js 1524 2007-03-13 20:09:19Z joern $
 *
 */
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: "click"
    },
    setDefaults: function(settings) {
        jQuery.extend(jQuery.Accordion.defaults, settings);
    }
});