diff options
Diffstat (limited to 'ui/ui.tabs.js')
-rw-r--r-- | ui/ui.tabs.js | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/ui/ui.tabs.js b/ui/ui.tabs.js index d75b2ab9f..d51fee912 100644 --- a/ui/ui.tabs.js +++ b/ui/ui.tabs.js @@ -48,13 +48,13 @@ $.widget("ui.tabs", { return $.cookie.apply(null, [cookie].concat($.makeArray(arguments))); }, _tabify: function(init) { - + this.$lis = $('li:has(a[href])', this.element); this.$tabs = this.$lis.map(function() { return $('a', this)[0]; }); this.$panels = $([]); - + var self = this, o = this.options; - + this.$tabs.each(function(i, a) { // inline tab if (a.hash && a.hash.replace('#', '')) // Safari 2 reports '#' for an empty hash @@ -77,14 +77,14 @@ $.widget("ui.tabs", { else o.disabled.push(i + 1); }); - + // initialization from scratch if (init) { - + // attach necessary classes for styling if not present this.element.addClass(o.navClass); this.$panels.addClass(o.panelClass); - + // Selected tab // use "selected" option or try to retrieve: // 1. from fragment identifier in url @@ -107,7 +107,7 @@ $.widget("ui.tabs", { o.selected = self.$lis.index( self.$lis.filter('.' + o.selectedClass)[0] ); } o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0; // first tab selected by default - + // Take disabling tabs via class attribute from HTML // into account and update option properly. // A selected tab cannot become disabled. @@ -117,7 +117,7 @@ $.widget("ui.tabs", { )).sort(); if ($.inArray(o.selected, o.disabled) != -1) o.disabled.splice($.inArray(o.selected, o.disabled), 1); - + // highlight selected tab this.$panels.addClass(o.hideClass); this.$lis.removeClass(o.selectedClass); @@ -126,41 +126,41 @@ $.widget("ui.tabs", { var classes = [o.selectedClass]; if (o.deselectable) classes.push(o.deselectableClass); this.$lis.eq(o.selected).addClass(classes.join(' ')); - + // seems to be expected behavior that the show callback is fired var onShow = function() { self._trigger('show', null, self.ui(self.$tabs[o.selected], self.$panels[o.selected])); }; - + // load if remote tab if ($.data(this.$tabs[o.selected], 'load.tabs')) this.load(o.selected, onShow); // just trigger show event else onShow(); } - + // clean up to avoid memory leaks in certain versions of IE 6 $(window).bind('unload', function() { self.$tabs.unbind('.tabs'); self.$lis = self.$tabs = self.$panels = null; }); - + } // update selected after add/remove else o.selected = this.$lis.index( this.$lis.filter('.' + o.selectedClass)[0] ); - + // set or update cookie after init and add/remove respectively if (o.cookie) this._cookie(o.selected, o.cookie); - + // disable tabs for (var i = 0, li; li = this.$lis[i]; i++) $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass); - + // reset cache if switching from cached to not cached if (o.cache === false) this.$tabs.removeData('cache.tabs'); - + // set up animations var hideFx, showFx; if (o.fx) { @@ -170,7 +170,7 @@ $.widget("ui.tabs", { } else hideFx = showFx = o.fx; } - + // Reset certain styles left over from animation // and prevent IE's ClearType bug... function resetStyle($el, fx) { @@ -191,7 +191,7 @@ $.widget("ui.tabs", { $show.removeClass(o.hideClass); self._trigger('show', null, self.ui(clicked, $show[0])); }; - + // Hide a tab, $show is optional... var hideTab = hideFx ? function(clicked, $hide, $show) { @@ -205,7 +205,7 @@ $.widget("ui.tabs", { $hide.addClass(o.hideClass); if ($show) showTab(clicked, $show); }; - + // Switch a tab... function switchTab(clicked, $li, $hide, $show) { var classes = [o.selectedClass]; @@ -213,15 +213,15 @@ $.widget("ui.tabs", { $li.addClass(classes.join(' ')).siblings().removeClass(classes.join(' ')); hideTab(clicked, $hide, $show); } - + // attach tab event handler, unbind to avoid duplicates from former tabifying... this.$tabs.unbind('.tabs').bind(o.event + '.tabs', function() { - + //var trueClick = event.clientX; // add to history only if true click occured, not a triggered click var $li = $(this).parents('li:eq(0)'), $hide = self.$panels.filter(':visible'), $show = $(self._sanitizeSelector(this.hash)); - + // If tab is already selected and not deselectable or tab disabled or // or is already loading or click callback returns false stop here. // Check if click handler returns false last so that it is not executed @@ -234,9 +234,9 @@ $.widget("ui.tabs", { this.blur(); return false; } - + o.selected = self.$tabs.index(this); - + // if tab may be closed if (o.deselectable) { if ($li.hasClass(o.selectedClass)) { @@ -257,12 +257,12 @@ $.widget("ui.tabs", { return false; } } - + if (o.cookie) self._cookie(o.selected, o.cookie); - + // stop possibly running animations self.$panels.stop(); - + // show new tab if ($show.length) { var a = this; @@ -277,31 +277,31 @@ $.widget("ui.tabs", { ); } else throw 'jQuery UI Tabs: Mismatching fragment identifier.'; - + // Prevent IE from keeping other link focussed when using the back button // and remove dotted border from clicked link. This is controlled via CSS // in modern browsers; blur() removes focus from address bar in Firefox // which can become a usability and annoying problem with tabs('rotate'). if ($.browser.msie) this.blur(); - + return false; - + }); - + // disable click if event is configured to something else if (o.event != 'click') this.$tabs.bind('click.tabs', function(){return false;}); - + }, add: function(url, label, index) { if (index == undefined) index = this.$tabs.length; // append by default - + var o = this.options; var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)); $li.data('destroy.tabs', true); - + var id = url.indexOf('#') == 0 ? url.replace('#', '') : this._tabId( $('a:first-child', $li)[0] ); - + // try to find an existing element before creating a new one var $panel = $('#' + id); if (!$panel.length) { @@ -317,12 +317,12 @@ $.widget("ui.tabs", { $li.insertBefore(this.$lis[index]); $panel.insertBefore(this.$panels[index]); } - + o.disabled = $.map(o.disabled, function(n, i) { return n >= index ? ++n : n }); - + this._tabify(); - + if (this.$tabs.length == 1) { $li.addClass(o.selectedClass); $panel.removeClass(o.hideClass); @@ -330,24 +330,24 @@ $.widget("ui.tabs", { if (href) this.load(index, href); } - + // callback this._trigger('add', null, this.ui(this.$tabs[index], this.$panels[index])); }, remove: function(index) { var o = this.options, $li = this.$lis.eq(index).remove(), $panel = this.$panels.eq(index).remove(); - + // If selected tab was removed focus tab to the right or // in case the last tab was removed the tab to the left. if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) this.select(index + (index + 1 < this.$tabs.length ? 1 : -1)); - + o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), function(n, i) { return n >= index ? --n : n }); - + this._tabify(); - + // callback this._trigger('remove', null, this.ui($li.find('a')[0], $panel[0])); }, @@ -355,7 +355,7 @@ $.widget("ui.tabs", { var o = this.options; if ($.inArray(index, o.disabled) == -1) return; - + var $li = this.$lis.eq(index).removeClass(o.disabledClass); if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... $li.css('display', 'inline-block'); @@ -363,9 +363,9 @@ $.widget("ui.tabs", { $li.css('display', 'block'); }, 0); } - + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); - + // callback this._trigger('enable', null, this.ui(this.$tabs[index], this.$panels[index])); }, @@ -373,10 +373,10 @@ $.widget("ui.tabs", { var self = this, o = this.options; if (index != o.selected) { // cannot disable already selected tab this.$lis.eq(index).addClass(o.disabledClass); - + o.disabled.push(index); o.disabled.sort(); - + // callback this._trigger('disable', null, this.ui(this.$tabs[index], this.$panels[index])); } @@ -388,20 +388,20 @@ $.widget("ui.tabs", { this.$tabs.eq(index).trigger(this.options.event + '.tabs'); }, load: function(index, callback) { // callback is for internal usage only - + var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0], bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs'); - + callback = callback || function() {}; - + // no remote or from cache - just finish with callback if (!url || !bypassCache && $.data(a, 'cache.tabs')) { callback(); return; } - + // load remote from here on - + var inner = function(parent) { var $parent = $(parent), $inner = $parent.find('*:last'); return $inner.length && $inner.is(':not(img)') && $inner || $parent; @@ -414,29 +414,29 @@ $.widget("ui.tabs", { }); self.xhr = null; }; - + if (o.spinner) { var label = inner(a).html(); inner(a).wrapInner('<em></em>') .find('em').data('label.tabs', label).html(o.spinner); } - + var ajaxOptions = $.extend({}, o.ajaxOptions, { url: url, success: function(r, s) { $(self._sanitizeSelector(a.hash)).html(r); cleanup(); - + if (o.cache) $.data(a, 'cache.tabs', true); // if loaded once do not load them again - + // callbacks self._trigger('load', null, self.ui(self.$tabs[index], self.$panels[index])); try { o.ajaxOptions.success(r, s); } catch (event) {} - + // This callback is required because the switch has to take // place after loading has completed. Call last in order to // fire load before show callback... @@ -519,24 +519,24 @@ $.extend($.ui.tabs, { $.extend($.ui.tabs.prototype, { rotation: null, rotate: function(ms, continuing) { - + continuing = continuing || false; - + var self = this, t = this.options.selected; - + function start() { self.rotation = setInterval(function() { t = ++t < self.$tabs.length ? t : 0; self.select(t); }, ms); } - + function stop(event) { if (!event || event.clientX) { // only in case of a true click clearInterval(self.rotation); } } - + // start interval if (ms) { start(); |