(function($) { $.widget("ui.tabs", { _init: function() { this._tabify(true);}, _setData: function(key, value) { if ((/^selected/).test(key))
this.select(value); else { this.options[key] = value; this._tabify();}
}, length: function() { return this.$tabs.length;}, _tabId: function(a) { return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || this.options.idPrefix + $.data(a);}, ui: function(tab, panel) { return { options: this.options, tab: tab, panel: panel, index: this.$tabs.index(tab)
};}, _sanitizeSelector: function(hash) { return hash.replace(/:/g, '\\:');}, _cookie: function() { var cookie = this.cookie || (this.cookie = 'ui-tabs-' + $.data(this.element[0])); 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) { if (a.hash && a.hash.replace('#', ''))
self.$panels = self.$panels.add(self._sanitizeSelector(a.hash)); else if ($(a).attr('href') != '#') { $.data(a, 'href.tabs', a.href); $.data(a, 'load.tabs', a.href); var id = self._tabId(a); a.href = '#' + id; var $panel = $('#' + id); if (!$panel.length) { $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass)
.insertAfter(self.$panels[i - 1] || self.element); $panel.data('destroy.tabs', true);}
self.$panels = self.$panels.add($panel);}
else
o.disabled.push(i + 1);}); if (init) { this.element.addClass(o.navClass); this.$panels.addClass(o.panelClass); if (o.selected === undefined) { if (location.hash) { this.$tabs.each(function(i, a) { if (a.hash == location.hash) { o.selected = i; return false;}
});}
else if (o.cookie) { var index = parseInt(self._cookie(), 10); if (index && self.$tabs[index]) o.selected = index;}
else if (self.$lis.filter('.' + o.selectedClass).length)
o.selected = self.$lis.index( self.$lis.filter('.' + o.selectedClass)[0] );}
o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0; o.disabled = $.unique(o.disabled.concat( $.map(this.$lis.filter('.' + o.disabledClass), function(n, i) { return self.$lis.index(n);} ) )).sort(); if ($.inArray(o.selected, o.disabled) != -1)
o.disabled.splice($.inArray(o.selected, o.disabled), 1); this.$panels.addClass(o.hideClass); this.$lis.removeClass(o.selectedClass); if (o.selected !== null) { this.$panels.eq(o.selected).removeClass(o.hideClass); var classes = [o.selectedClass]; if (o.deselectable) classes.push(o.deselectableClass); this.$lis.eq(o.selected).addClass(classes.join(' ')); var onShow = function() { self._trigger('show', null, self.ui(self.$tabs[o.selected], self.$panels[o.selected]));}; if ($.data(this.$tabs[o.selected], 'load.tabs'))
this.load(o.selected, onShow); else onShow();}
$(window).bind('unload', function() { self.$tabs.unbind('.tabs'); self.$lis = self.$tabs = self.$panels = null;});}
else
o.selected = this.$lis.index( this.$lis.filter('.' + o.selectedClass)[0] ); if (o.cookie) this._cookie(o.selected, o.cookie); for (var i = 0, li; li = this.$lis[i]; i++)
$(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass); if (o.cache === false) this.$tabs.removeData('cache.tabs'); var hideFx, showFx; if (o.fx) { if (o.fx.constructor == Array) { hideFx = o.fx[0]; showFx = o.fx[1];}
else hideFx = showFx = o.fx;}
function resetStyle($el, fx) { $el.css({ display: '' }); if ($.browser.msie && fx.opacity) $el[0].style.removeAttribute('filter');}
var showTab = showFx ?
function(clicked, $show) { $show.animate(showFx, showFx.duration || 'normal', function() { $show.removeClass(o.hideClass); resetStyle($show, showFx); self._trigger('show', null, self.ui(clicked, $show[0]));});} :
function(clicked, $show) { $show.removeClass(o.hideClass); self._trigger('show', null, self.ui(clicked, $show[0]));}; var hideTab = hideFx ?
function(clicked, $hide, $show) { $hide.animate(hideFx, hideFx.duration || 'normal', function() { $hide.addClass(o.hideClass); resetStyle($hide, hideFx); if ($show) showTab(clicked, $show, $hide);});} :
function(clicked, $hide, $show) { $hide.addClass(o.hideClass); if ($show) showTab(clicked, $show);}; function switchTab(clicked, $li, $hide, $show) { var classes = [o.selectedClass]; if (o.deselectable) classes.push(o.deselectableClass); $li.addClass(classes.join(' ')).siblings().removeClass(classes.join(' ')); hideTab(clicked, $hide, $show);}
this.$tabs.unbind('.tabs').bind(o.event + '.tabs', function() { var $li = $(this).parents('li:eq(0)'), $hide = self.$panels.filter(':visible'), $show = $(self._sanitizeSelector(this.hash)); if (($li.hasClass(o.selectedClass) && !o.deselectable) || $li.hasClass(o.disabledClass) || $(this).hasClass(o.loadingClass) || self._trigger('select', null, self.ui(this, $show[0])) === false ) { this.blur(); return false;}
o.selected = self.$tabs.index(this); if (o.deselectable) { if ($li.hasClass(o.selectedClass)) { self.options.selected = null; $li.removeClass([o.selectedClass, o.deselectableClass].join(' ')); self.$panels.stop(); hideTab(this, $hide); this.blur(); return false;} else if (!$hide.length) { self.$panels.stop(); var a = this; self.load(self.$tabs.index(this), function() { $li.addClass([o.selectedClass, o.deselectableClass].join(' ')); showTab(a, $show);}); this.blur(); return false;}
}
if (o.cookie) self._cookie(o.selected, o.cookie); self.$panels.stop(); if ($show.length) { var a = this; self.load(self.$tabs.index(this), $hide.length ?
function() { switchTab(a, $li, $hide, $show);} :
function() { $li.addClass(o.selectedClass); showTab(a, $show);} );} else
throw 'jQuery UI Tabs: Mismatching fragment identifier.'; if ($.browser.msie) this.blur(); return false;}); if (o.event != 'click') this.$tabs.bind('click.tabs', function(){return false;});}, add: function(url, label, index) { if (index == undefined)
index = this.$tabs.length; 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] ); var $panel = $('#' + id); if (!$panel.length) { $panel = $(o.panelTemplate).attr('id', id)
.addClass(o.hideClass)
.data('destroy.tabs', true);}
$panel.addClass(o.panelClass); if (index >= this.$lis.length) { $li.appendTo(this.element); $panel.appendTo(this.element[0].parentNode);} else { $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); var href = $.data(this.$tabs[0], 'load.tabs'); if (href)
this.load(index, href);}
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 ($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(); this._trigger('remove', null, this.ui($li.find('a')[0], $panel[0]));}, enable: function(index) { var o = this.options; if ($.inArray(index, o.disabled) == -1)
return; var $li = this.$lis.eq(index).removeClass(o.disabledClass); if ($.browser.safari) { $li.css('display', 'inline-block'); setTimeout(function() { $li.css('display', 'block');}, 0);}
o.disabled = $.grep(o.disabled, function(n, i) { return n != index;}); this._trigger('enable', null, this.ui(this.$tabs[index], this.$panels[index]));}, disable: function(index) { var self = this, o = this.options; if (index != o.selected) { this.$lis.eq(index).addClass(o.disabledClass); o.disabled.push(index); o.disabled.sort(); this._trigger('disable', null, this.ui(this.$tabs[index], this.$panels[index]));}
}, select: function(index) { if (typeof index == 'string')
index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] ); this.$tabs.eq(index).trigger(this.options.event + '.tabs');}, load: function(index, callback) { 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() {}; if (!url || !bypassCache && $.data(a, 'cache.tabs')) { callback(); return;}
var inner = function(parent) { var $parent = $(parent), $inner = $parent.find('*:last'); return $inner.length && $inner.is(':not(img)') && $inner || $parent;}; var cleanup = function() { self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass)
.each(function() { if (o.spinner)
inner(this).parent().html(inner(this).data('label.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); self._trigger('load', null, self.ui(self.$tabs[index], self.$panels[index])); try { o.ajaxOptions.success(r, s);}
catch (e) {}
callback();}
}); if (this.xhr) { this.xhr.abort(); cleanup();}
$a.addClass(o.loadingClass); self.xhr = $.ajax(ajaxOptions);}, url: function(index, url) { this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url);}, destroy: function() { var o = this.options; this.element.unbind('.tabs')
.removeClass(o.navClass).removeData('tabs'); this.$tabs.each(function() { var href = $.data(this, 'href.tabs'); if (href)
this.href = href; var $this = $(this).unbind('.tabs'); $.each(['href', 'load', 'cache'], function(i, prefix) { $this.removeData(prefix + '.tabs');});}); this.$lis.add(this.$panels).each(function() { if ($.data(this, 'destroy.tabs'))
$(this).remove(); else
$(this).removeClass([o.selectedClass, o.deselectableClass, o.disabledClass, o.panelClass, o.hideClass].join(' '));}); if (o.cookie)
this._cookie(null, o.cookie);}
}); $.extend($.ui.tabs, { version: '@VERSION', getter: 'length', defaults: { deselectable: false, event: 'click', disabled: [], cookie: null, spinner: 'Loading&#8230;', cache: false, idPrefix: 'ui-tabs-', ajaxOptions: null, fx: null, tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>', panelTemplate: '<div></div>', navClass: 'ui-tabs-nav', selectedClass: 'ui-tabs-selected', deselectableClass: 'ui-tabs-deselectable', disabledClass: 'ui-tabs-disabled', panelClass: 'ui-tabs-panel', hideClass: 'ui-tabs-hide', loadingClass: 'ui-tabs-loading'
}
}); $.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(e) { if (!e || e.clientX) { clearInterval(self.rotation);}
}
if (ms) { start(); if (!continuing)
this.$tabs.bind(this.options.event + '.tabs', stop); else
this.$tabs.bind(this.options.event + '.tabs', function() { stop(); t = self.options.selected; start();});}
else { stop(); this.$tabs.unbind(this.options.event + '.tabs', stop);}
}
});})(jQuery); 
