| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /* ==========================================================
- * sco.tab.js
- * http://github.com/terebentina/sco.js
- * ==========================================================
- * Copyright 2013 Dan Caragea.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
- /*jshint laxcomma:true, sub:true, browser:true, jquery:true, devel:true */
- ;(function($, undefined) {
- "use strict";
- var pluginName = 'scojs_tab';
- function Tab($header_wrapper, options) {
- this.options = $.extend({}, $.fn[pluginName].defaults, options);
- this.$header_wrapper = $header_wrapper;
- if (this.options.content === undefined) {
- this.options.content = this.$header_wrapper[this.options.mode]('.pane-wrapper');
- }
- var self = this
- ,auto_click = false
- ;
- if (typeof this.options.onBeforeSelect == 'function') {
- this.options.onBeforeSelect = $.proxy(this.options.onBeforeSelect, self);
- }
- this.panes = $.scojs_panes(this.options.content, this.options);
- this.$header_wrapper.find('> li').removeClass('active').eq(this.options.active).addClass('active');
- this.$header_wrapper.on('click.' + pluginName, 'a', function(e) {
- var $this = $(this)
- ,$my_li = $this.closest('li')
- ,my_index = $my_li.index()
- ;
- if (!$.address || $this.attr('href') == '#') {
- e.preventDefault();
- }
- if (self.panes.select(my_index)) {
- self.$header_wrapper.find('> li.active').removeClass('active');
- $my_li.addClass('active');
- }
- });
- if ($.address) {
- $.address.externalChange(function(e) {
- var hash = '#' + e.value.slice(1);
- self.$header_wrapper.find('> li a').each(function() {
- var $this = $(this);
- if ($this.attr('href') === hash) {
- $this.trigger('click');
- return false;
- }
- });
- }).history(true);
- }
- }
- $.extend(Tab.prototype, {
- select: function(index) {
- this.$header_wrapper.find('> li:eq(' + index + ') a').trigger('click');
- return this;
- }
- });
- $.fn[pluginName] = function(options) {
- return this.each(function() {
- var obj;
- if (!(obj = $.data(this, pluginName))) {
- var $this = $(this)
- ,data = $this.data()
- ,opts = $.extend({}, $.fn[pluginName].defaults, options, data)
- ;
- obj = new Tab($this, opts);
- $.data(this, pluginName, obj);
- }
- });
- };
- $[pluginName] = function(elem, options) {
- if (typeof elem === 'string') {
- elem = $(elem);
- }
- return new Tab(elem, options);
- };
- $.fn[pluginName].defaults = {
- active: 0
- ,mode: 'next' // "next" means panes are under headers, "prev" means panes are above headers
- ,easing: ''
- };
- $(function() {
- $('[data-trigger="tab"]')[pluginName]();
- });
- })(jQuery);
|