summaryrefslogtreecommitdiffstats
path: root/js/foundation/foundation.accordion.js
blob: e3115bb6b0c6e59f0a08e5f5e2203bc1142ad92d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
;
(function ($, window, document, undefined) {
    'use strict';

    Foundation.libs.accordion = {
        name: 'accordion',

        version: '5.5.0',

        settings: {
            content_class: 'content',
            active_class: 'active',
            multi_expand: false,
            toggleable: true,
            callback: function () {
            }
        },

        init: function (scope, method, options) {
            this.bindings(method, options);
        },

        events: function () {
            var self = this;
            var S = this.S;
            S(this.scope)
                .off('.fndtn.accordion')
                .on('click.fndtn.accordion', '[' + this.attr_name() + '] > .accordion-navigation > a', function (e) {
                    var accordion = S(this).closest('[' + self.attr_name() + ']'),
                        groupSelector = self.attr_name() + '=' + accordion.attr(self.attr_name()),
                        settings = accordion.data(self.attr_name(true) + '-init') || self.settings,
                        target = S('#' + this.href.split('#')[1]),
                        aunts = $('> .accordion-navigation', accordion),
                        siblings = aunts.children('.' + settings.content_class),
                        active_content = siblings.filter('.' + settings.active_class);

                    e.preventDefault();

                    if (accordion.attr(self.attr_name())) {
                        siblings = siblings.add('[' + groupSelector + '] dd > ' + '.' + settings.content_class);
                        aunts = aunts.add('[' + groupSelector + '] .accordion-navigation');
                    }

                    if (settings.toggleable && target.is(active_content)) {
                        target.parent('.accordion-navigation').toggleClass(settings.active_class, false);
                        target.toggleClass(settings.active_class, false);
                        settings.callback(target);
                        target.triggerHandler('toggled', [accordion]);
                        accordion.triggerHandler('toggled', [target]);
                        return;
                    }

                    if (!settings.multi_expand) {
                        siblings.removeClass(settings.active_class);
                        aunts.removeClass(settings.active_class);
                    }

                    target.addClass(settings.active_class).parent().addClass(settings.active_class);
                    settings.callback(target);
                    target.triggerHandler('toggled', [accordion]);
                    accordion.triggerHandler('toggled', [target]);
                });
        },

        off: function () {
        },

        reflow: function () {
        }
    };
}(jQuery, window, window.document));