/** * Gumby Tabs */ !function($) { 'use strict'; function Tabs($el) { Gumby.debug('Initializing Tabs', $el); this.$el = $el; this.$nav = this.$el.find('> ul.tab-nav > li'); this.$content = this.$el.children('.tab-content'); var scope = this; // listen for click event on tab nav and custom gumby set event this.$nav.children('a').on(Gumby.click, function(e) { e.preventDefault(); scope.click($(this)); }); // listen for gumby.set value for dynamically set tabs this.$el.on('gumby.set', function(e, index) { Gumby.debug('Set event triggered', scope.$el); scope.set(e, index); }); } // handle tab nav click event Tabs.prototype.click = function($this) { // index of item to activate var index = $this.parent().index(); if(this.$nav.eq(index).add(this.$content.eq(index)).hasClass('active')) { return; } Gumby.debug('Setting active tab to '+index, this.$el); // deactivate other tab navigation and content this.$nav.add(this.$content).removeClass('active'); // activate this tab nav link and content this.$nav.eq(index).add(this.$content.eq(index)).addClass('active'); // trigger gumby.change event and pass current active tab index Gumby.debug('Triggering onChange event', this.$el); this.$el.trigger('gumby.onChange', index); }; // set specific tab Tabs.prototype.set = function(e, index) { this.$nav.eq(index).find('a').trigger(Gumby.click); }; // add initialisation Gumby.addInitalisation('tabs', function() { $('.tabs').each(function() { var $this = $(this); // this element has already been initialized if($this.data('isTabs')) { return true; } // mark element as initialized $this.data('isTabs', true); new Tabs($this); }); }); // register UI module Gumby.UIModule({ module: 'tabs', events: ['onChange', 'set'], init: function() { Gumby.initialize('tabs'); } }); }(jQuery);