aboutsummaryrefslogtreecommitdiffstats
path: root/ui/ui.tabs.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/ui.tabs.js')
-rw-r--r--ui/ui.tabs.js126
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();