diff --git a/wp-includes/js/jquery/ui.core.js b/wp-includes/js/jquery/ui.core.js new file mode 100644 index 0000000000..4a279f73a4 --- /dev/null +++ b/wp-includes/js/jquery/ui.core.js @@ -0,0 +1,241 @@ +/* + * jQuery UI @VERSION + * + * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + * + * $Id: ui.core.js 5587 2008-05-13 19:56:42Z scott.gonzalez $ + */ +;(function($) { + + $.ui = { + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + cssCache: {}, + css: function(name) { + if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; } + var tmp = $('
').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body'); + + //if (!$.browser.safari) + //tmp.appendTo('body'); + + //Opera and Safari set width and height to 0px instead of auto + //Safari returns rgba(0,0,0,0) when bgcolor is not set + $.ui.cssCache[name] = !!( + (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || + !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))) + ); + try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){} + return $.ui.cssCache[name]; + }, + disableSelection: function(e) { + e.unselectable = "on"; + e.onselectstart = function() { return false; }; + if (e.style) { e.style.MozUserSelect = "none"; } + }, + enableSelection: function(e) { + e.unselectable = "off"; + e.onselectstart = function() { return true; }; + if (e.style) { e.style.MozUserSelect = ""; } + }, + hasScroll: function(e, a) { + var scroll = /top/.test(a||"top") ? 'scrollTop' : 'scrollLeft', has = false; + if (e[scroll] > 0) return true; e[scroll] = 1; + has = e[scroll] > 0 ? true : false; e[scroll] = 0; + return has; + } + }; + + + /** jQuery core modifications and additions **/ + + var _remove = $.fn.remove; + $.fn.remove = function() { + $("*", this).add(this).trigger("remove"); + return _remove.apply(this, arguments ); + }; + + // $.widget is a factory to create jQuery plugins + // taking some boilerplate code out of the plugin code + // created by Scott González and Jörn Zaefferer + function getter(namespace, plugin, method) { + var methods = $[namespace][plugin].getter || []; + methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods); + return ($.inArray(method, methods) != -1); + }; + + var widgetPrototype = { + init: function() {}, + destroy: function() { + this.element.removeData(this.widgetName); + }, + + getData: function(key) { + return this.options[key]; + }, + setData: function(key, value) { + this.options[key] = value; + }, + + enable: function() { + this.setData('disabled', false); + }, + disable: function() { + this.setData('disabled', true); + } + }; + + $.widget = function(name, prototype) { + var namespace = name.split(".")[0]; + name = name.split(".")[1]; + // create plugin method + $.fn[name] = function(options, data) { + var isMethodCall = (typeof options == 'string'); + [].shift.call(arguments); + + if (isMethodCall && getter(namespace, name, options)) { + var instance = $.data(this[0], name); + return (instance ? instance[options].apply(instance, arguments) + : undefined); + } + + return this.each(function() { + var instance = $.data(this, name); + if (!instance) { + $.data(this, name, new $[namespace][name](this, options)); + } else if (isMethodCall) { + instance[options].apply(instance, arguments); + } + }); + }; + + // create widget constructor + $[namespace][name] = function(element, options) { + var self = this; + + this.widgetName = name; + + this.options = $.extend({}, $[namespace][name].defaults, options); + this.element = $(element) + .bind('setData.' + name, function(e, key, value) { + return self.setData(key, value); + }) + .bind('getData.' + name, function(e, key) { + return self.getData(key); + }) + .bind('remove', function() { + return self.destroy(); + }); + this.init(); + }; + + // add widget prototype + $[namespace][name].prototype = $.extend({}, widgetPrototype, prototype); + }; + + + /** Mouse Interaction Plugin **/ + + $.widget("ui.mouse", { + init: function() { + var self = this; + + this.element + .bind('mousedown.mouse', function() { return self.click.apply(self, arguments); }) + .bind('mouseup.mouse', function() { (self.timer && clearTimeout(self.timer)); }) + .bind('click.mouse', function() { if(self.initialized) { self.initialized = false; return false; } }); + //Prevent text selection in IE + if ($.browser.msie) { + this.unselectable = this.element.attr('unselectable'); + this.element.attr('unselectable', 'on'); + } + }, + destroy: function() { + this.element.unbind('.mouse').removeData("mouse"); + ($.browser.msie && this.element.attr('unselectable', this.unselectable)); + }, + trigger: function() { return this.click.apply(this, arguments); }, + click: function(e) { + + if( e.which != 1 //only left click starts dragging + || $.inArray(e.target.nodeName.toLowerCase(), this.options.dragPrevention || []) != -1 // Prevent execution on defined elements + || (this.options.condition && !this.options.condition.apply(this.options.executor || this, [e, this.element])) //Prevent execution on condition + ) { return true; } + + var self = this; + this.initialized = false; + var initialize = function() { + self._MP = { left: e.pageX, top: e.pageY }; // Store the click mouse position + $(document).bind('mouseup.mouse', function() { return self.stop.apply(self, arguments); }); + $(document).bind('mousemove.mouse', function() { return self.drag.apply(self, arguments); }); + + if(!self.initalized && Math.abs(self._MP.left-e.pageX) >= self.options.distance || Math.abs(self._MP.top-e.pageY) >= self.options.distance) { + (self.options.start && self.options.start.call(self.options.executor || self, e, self.element)); + (self.options.drag && self.options.drag.call(self.options.executor || self, e, this.element)); //This is actually not correct, but expected + self.initialized = true; + } + }; + + if(this.options.delay) { + if(this.timer) { clearTimeout(this.timer); } + this.timer = setTimeout(initialize, this.options.delay); + } else { + initialize(); + } + + return false; + + }, + stop: function(e) { + + if(!this.initialized) { + return $(document).unbind('mouseup.mouse').unbind('mousemove.mouse'); + } + + (this.options.stop && this.options.stop.call(this.options.executor || this, e, this.element)); + + $(document).unbind('mouseup.mouse').unbind('mousemove.mouse'); + return false; + + }, + drag: function(e) { + + var o = this.options; + if ($.browser.msie && !e.button) { + return this.stop.call(this, e); // IE mouseup check + } + + if(!this.initialized && (Math.abs(this._MP.left-e.pageX) >= o.distance || Math.abs(this._MP.top-e.pageY) >= o.distance)) { + (o.start && o.start.call(o.executor || this, e, this.element)); + this.initialized = true; + } else { + if(!this.initialized) { return false; } + } + + (o.drag && o.drag.call(this.options.executor || this, e, this.element)); + return false; + + } + }); + +})(jQuery); diff --git a/wp-includes/js/jquery/ui.tabs.js b/wp-includes/js/jquery/ui.tabs.js index 8634b412f8..7800375492 100644 --- a/wp-includes/js/jquery/ui.tabs.js +++ b/wp-includes/js/jquery/ui.tabs.js @@ -1,529 +1,594 @@ /* - * Tabs 3 - New Wave Tabs + * jQuery UI Tabs * - * Copyright (c) 2007 Klaus Hartl (stilbuero.de) + * Copyright (c) 2007, 2008 Klaus Hartl (stilbuero.de) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * ui.core.js + * + * Revision: $Id: ui.tabs.js 5547 2008-05-10 08:33:38Z klaus.hartl $ + */ +;(function($) { + + $.widget("ui.tabs", { + init: function() { + this.options.event += '.tabs'; // namespace event + + // create tabs + 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 { + instance: this, + options: this.options, + tab: tab, + panel: panel + }; + }, + 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 + self.$panels = self.$panels.add(a.hash); + // remote tab + else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#" + $.data(a, 'href.tabs', a.href); // required for restore on destroy + $.data(a, 'load.tabs', a.href); // mutable + 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 ); + } + // invalid tab href + else + o.disabled.push(i + 1); + }); + + if (init) { + + // attach necessary classes for styling if not present + this.element.hasClass(o.navClass) || this.element.addClass(o.navClass); + this.$panels.each(function() { + var $this = $(this); + $this.hasClass(o.panelClass) || $this.addClass(o.panelClass); + }); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on
  • + if (o.selected === undefined) { + if (location.hash) { + this.$tabs.each(function(i, a) { + if (a.hash == location.hash) { + o.selected = i; + // prevent page scroll to fragment + if ($.browser.msie || $.browser.opera) { // && !o.remote + var $toShow = $(location.hash), toShowId = $toShow.attr('id'); + $toShow.attr('id', ''); + setTimeout(function() { + $toShow.attr('id', toShowId); // restore id + }, 500); + } + scrollTo(0, 0); + return false; // break + } + }); + } + else if (o.cookie) { + var index = parseInt($.cookie('ui-tabs' + $.data(self.element)),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; // 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. + 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); + + // highlight selected tab + this.$panels.addClass(o.hideClass); + this.$lis.removeClass(o.selectedClass); + if (o.selected !== null) { + this.$panels.eq(o.selected).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before + this.$lis.eq(o.selected).addClass(o.selectedClass); + + // seems to be expected behavior that the show callback is fired + var onShow = function() { + $(self.element).triggerHandler('tabsshow', + [self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show); + }; + + // 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; + }); + + } + + // 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, baseFx = { 'min-width': 0, duration: 1 }, baseDuration = 'normal'; + if (o.fx && o.fx.constructor == Array) + hideFx = o.fx[0] || baseFx, showFx = o.fx[1] || baseFx; + else + hideFx = showFx = o.fx || baseFx; + + // reset some styles to maintain print style sheets etc. + var resetCSS = { display: '', overflow: '', height: '' }; + if (!$.browser.msie) // not in IE to prevent ClearType font issue + resetCSS.opacity = ''; + + // Hide a tab, animation prevents browser scrolling to fragment, + // $show is optional. + function hideTab(clicked, $hide, $show) { + $hide.animate(hideFx, hideFx.duration || baseDuration, function() { // + $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && hideFx.opacity) + $hide[0].style.filter = ''; + if ($show) + showTab(clicked, $show, $hide); + }); + } + + // Show a tab, animation prevents browser scrolling to fragment, + // $hide is optional. + function showTab(clicked, $show, $hide) { + if (showFx === baseFx) + $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels + $show.animate(showFx, showFx.duration || baseDuration, function() { + $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && showFx.opacity) + $show[0].style.filter = ''; + + // callback + $(self.element).triggerHandler('tabsshow', + [self.ui(clicked, $show[0])], o.show); + + }); + } + + // switch a tab + function switchTab(clicked, $li, $hide, $show) { + /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click + $.ajaxHistory.update(clicked.hash); + }*/ + $li.addClass(o.selectedClass) + .siblings().removeClass(o.selectedClass); + hideTab(clicked, $hide, $show); + } + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.$tabs.unbind('.tabs').bind(o.event, function() { + + //var trueClick = e.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 = $(this.hash); + + // If tab is already selected and not unselectable 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 + // for a disabled or loading tab! + if (($li.hasClass(o.selectedClass) && !o.unselect) + || $li.hasClass(o.disabledClass) + || $(this).hasClass(o.loadingClass) + || $(self.element).triggerHandler('tabsselect', [self.ui(this, $show[0])], o.select) === false + ) { + this.blur(); + return false; + } + + self.options.selected = self.$tabs.index(this); + + // if tab may be closed + if (o.unselect) { + if ($li.hasClass(o.selectedClass)) { + self.options.selected = null; + $li.removeClass(o.selectedClass); + 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).addClass(o.unselectClass); + showTab(a, $show); + }); + this.blur(); + return false; + } + } + + if (o.cookie) + $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie); + + // stop possibly running animations + self.$panels.stop(); + + // show new tab + if ($show.length) { + + // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled + /*if ($.browser.msie && o.bookmarkable) { + var showId = this.hash.replace('#', ''); + $show.attr('id', ''); + setTimeout(function() { + $show.attr('id', showId); // restore id + }, 0); + }*/ + + 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); + } + ); + + // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash + /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0; + setTimeout(function() { + scrollTo(scrollX, scrollY); + }, 0);*/ + + } 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 in modern + // browsers via CSS, also blur removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabsRotate. + if ($.browser.msie) + this.blur(); + + //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE + return false; + + }); + + // disable click if event is configured to something else + if (!(/^click/).test(o.event)) + 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\}/, url).replace(/#\{label\}/, 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) { + $panel = $(o.panelTemplate).attr('id', id) + .addClass(o.panelClass).addClass(o.hideClass); + $panel.data('destroy.tabs', true); + } + 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); + } + + // callback + this.element.triggerHandler('tabsadd', + [this.ui(this.$tabs[index], this.$panels[index])], o.add + ); + }, + 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.element.triggerHandler('tabsremove', + [this.ui($li.find('a')[0], $panel[0])], o.remove + ); + }, + 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) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... + $li.css('display', 'inline-block'); + setTimeout(function() { + $li.css('display', 'block'); + }, 0); + } + + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); + + // callback + this.element.triggerHandler('tabsenable', + [this.ui(this.$tabs[index], this.$panels[index])], o.enable + ); + + }, + disable: function(index) { + 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.element.triggerHandler('tabsdisable', + [this.ui(this.$tabs[index], this.$panels[index])], o.disable + ); + } + }, + 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); + }, + 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 || $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('') + .find('em').data('label.tabs', label).html(o.spinner); + } + + var ajaxOptions = $.extend({}, o.ajaxOptions, { + url: url, + success: function(r, s) { + $(a.hash).html(r); + cleanup(); + + if (o.cache) + $.data(a, 'cache.tabs', true); // if loaded once do not load them again + + // callbacks + $(self.element).triggerHandler('tabsload', + [self.ui(self.$tabs[index], self.$panels[index])], o.load + ); + o.ajaxOptions.success && o.ajaxOptions.success(r, s); + + // 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... + callback(); + } + }); + if (this.xhr) { + // terminate pending requests from other tabs and restore tab label + this.xhr.abort(); + cleanup(); + } + $a.addClass(o.loadingClass); + setTimeout(function() { // timeout is again required in IE, "wait" for id being restored + self.xhr = $.ajax(ajaxOptions); + }, 0); + + }, + 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.unselectClass, + o.disabledClass, o.panelClass, o.hideClass].join(' ')); + }); + } + }); + + $.ui.tabs.defaults = { + // basic setup + unselect: false, + event: 'click', + disabled: [], + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + // TODO history: false, + + // Ajax + spinner: 'Loading…', + cache: false, + idPrefix: 'ui-tabs-', + ajaxOptions: {}, + + // animations + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + + // templates + tabTemplate: '
  • #{label}
  • ', + panelTemplate: '
    ', + + // CSS classes + navClass: 'ui-tabs-nav', + selectedClass: 'ui-tabs-selected', + unselectClass: 'ui-tabs-unselect', + disabledClass: 'ui-tabs-disabled', + panelClass: 'ui-tabs-panel', + hideClass: 'ui-tabs-hide', + loadingClass: 'ui-tabs-loading' + }; + + $.ui.tabs.getter = "length"; + +/* + * Tabs Extensions */ -(function($) { - - // if the UI scope is not availalable, add it - $.ui = $.ui || {}; - - // tabs initialization - $.fn.tabs = function(initial, options) { - if (initial && initial.constructor == Object) { // shift arguments - options = initial; - initial = null; - } - options = options || {}; - - initial = initial && initial.constructor == Number && --initial || 0; - - return this.each(function() { - new $.ui.tabs(this, $.extend(options, { initial: initial })); - }); - }; - - // other chainable tabs methods - $.each(['Add', 'Remove', 'Enable', 'Disable', 'Click', 'Load', 'Href'], function(i, method) { - $.fn['tabs' + method] = function() { - var args = arguments; - return this.each(function() { - var instance = $.ui.tabs.getInstance(this); - instance[method.toLowerCase()].apply(instance, args); - }); - }; - }); - $.fn.tabsSelected = function() { - var selected = -1; - if (this[0]) { - var instance = $.ui.tabs.getInstance(this[0]), - $lis = $('li', this); - selected = $lis.index( $lis.filter('.' + instance.options.selectedClass)[0] ); - } - return selected >= 0 ? ++selected : -1; - }; - - // tabs class - $.ui.tabs = function(el, options) { - - this.source = el; - - this.options = $.extend({ - - // basic setup - initial: 0, - event: 'click', - disabled: [], - cookie: null, // pass options object as expected by cookie plugin: { expires: 7, path: '/', domain: 'jquery.com', secure: true } - // TODO bookmarkable: $.ajaxHistory ? true : false, - unselected: false, - unselect: options.unselected ? true : false, - - // Ajax - spinner: 'Loading…', - cache: false, - idPrefix: 'ui-tabs-', - ajaxOptions: {}, - - // animations - /*fxFade: null, - fxSlide: null, - fxShow: null, - fxHide: null,*/ - fxSpeed: 'normal', - /*fxShowSpeed: null, - fxHideSpeed: null,*/ - - // callbacks - add: function() {}, - remove: function() {}, - enable: function() {}, - disable: function() {}, - click: function() {}, - hide: function() {}, - show: function() {}, - load: function() {}, - - // templates - tabTemplate: '
  • #{text}
  • ', - panelTemplate: '
    ', - - // CSS classes - navClass: 'ui-tabs-nav', - selectedClass: 'ui-tabs-selected', - unselectClass: 'ui-tabs-unselect', - disabledClass: 'ui-tabs-disabled', - panelClass: 'ui-tabs-panel', - hideClass: 'ui-tabs-hide', - loadingClass: 'ui-tabs-loading' - - }, options); - - this.options.event += '.ui-tabs'; // namespace event - this.options.cookie = $.cookie && $.cookie.constructor == Function && this.options.cookie; - - // save instance for later - $.data(el, $.ui.tabs.INSTANCE_KEY, this); - - // create tabs - this.tabify(true); - }; - - // static - $.ui.tabs.INSTANCE_KEY = 'ui_tabs_instance'; - $.ui.tabs.getInstance = function(el) { - return $.data(el, $.ui.tabs.INSTANCE_KEY); - }; - - // instance methods - $.extend($.ui.tabs.prototype, { - tabId: function(a) { - return a.title ? a.title.replace(/\s/g, '_') - : this.options.idPrefix + $.data(a); - }, - tabify: function(init) { - - this.$lis = $('li:has(a[href])', this.source); - 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 - self.$panels = self.$panels.add(a.hash); - } - // remote tab - else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#" - $.data(a, 'href', a.href); - var id = self.tabId(a); - a.href = '#' + id; - self.$panels = self.$panels.add( - $('#' + id)[0] || $(o.panelTemplate).attr('id', id).addClass(o.panelClass) - .insertAfter( self.$panels[i - 1] || self.source ) - ); - } - // invalid tab href - else { - o.disabled.push(i + 1); - } - }); - - if (init) { - - // attach necessary classes for styling if not present - $(this.source).hasClass(o.navClass) || $(this.source).addClass(o.navClass); - this.$panels.each(function() { - var $this = $(this); - $this.hasClass(o.panelClass) || $this.addClass(o.panelClass); - }); - - // disabled tabs - for (var i = 0, position; position = o.disabled[i]; i++) { - this.disable(position); - } - - // Try to retrieve initial tab: - // 1. from fragment identifier in url if present - // 2. from cookie - // 3. from selected class attribute on
  • - // 4. otherwise use given initial argument - // 5. check if tab is disabled - this.$tabs.each(function(i, a) { - if (location.hash) { - if (a.hash == location.hash) { - o.initial = i; - // prevent page scroll to fragment - //if (($.browser.msie || $.browser.opera) && !o.remote) { - if ($.browser.msie || $.browser.opera) { - var $toShow = $(location.hash), toShowId = $toShow.attr('id'); - $toShow.attr('id', ''); - setTimeout(function() { - $toShow.attr('id', toShowId); // restore id - }, 500); - } - scrollTo(0, 0); - return false; // break - } - } else if (o.cookie) { - o.initial = parseInt($.cookie( $.ui.tabs.INSTANCE_KEY + $.data(self.source) )) || 0; - return false; // break - } else if ( self.$lis.eq(i).hasClass(o.selectedClass) ) { - o.initial = i; - return false; // break - } - }); - var n = this.$lis.length; - while (this.$lis.eq(o.initial).hasClass(o.disabledClass) && n) { - o.initial = ++o.initial < this.$lis.length ? o.initial : 0; - n--; - } - if (!n) { // all tabs disabled, set option unselected to true - o.unselected = o.unselect = true; - } - - // highlight selected tab - this.$panels.addClass(o.hideClass); - this.$lis.removeClass(o.selectedClass); - if (!o.unselected) { - this.$panels.eq(o.initial).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before - this.$lis.eq(o.initial).addClass(o.selectedClass); - } - - // load if remote tab - var href = !o.unselected && $.data(this.$tabs[o.initial], 'href'); - if (href) { - this.load(o.initial + 1, href); - } - - // disable click if event is configured to something else - if (!/^click/.test(o.event)) { - this.$tabs.bind('click', function(e) { e.preventDefault(); }); - } - - } - - // setup animations - var showAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed, - hideAnim = {}, hideSpeed = o.fxHideSpeed || o.fxSpeed; - if (o.fxSlide || o.fxFade) { - if (o.fxSlide) { - showAnim['height'] = 'show'; - hideAnim['height'] = 'hide'; - } - if (o.fxFade) { - showAnim['opacity'] = 'show'; - hideAnim['opacity'] = 'hide'; - } - } else { - if (o.fxShow) { - showAnim = o.fxShow; - } else { // use some kind of animation to prevent browser scrolling to the tab - showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox - showSpeed = 1; // as little as 1 is sufficient - } - if (o.fxHide) { - hideAnim = o.fxHide; - } else { // use some kind of animation to prevent browser scrolling to the tab - hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox - hideSpeed = 1; // as little as 1 is sufficient - } - } - - // reset some styles to maintain print style sheets etc. - var resetCSS = { display: '', overflow: '', height: '' }; - if (!$.browser.msie) { // not in IE to prevent ClearType font issue - resetCSS['opacity'] = ''; - } - - // Hide a tab, animation prevents browser scrolling to fragment, - // $show is optional. - function hideTab(clicked, $hide, $show) { - $hide.animate(hideAnim, hideSpeed, function() { // - $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. - if ($.browser.msie && hideAnim['opacity']) { - $hide[0].style.filter = ''; - } - o.hide(clicked, $hide[0], $show && $show[0] || null); - if ($show) { - showTab(clicked, $show, $hide); - } - }); - } - - // Show a tab, animation prevents browser scrolling to fragment, - // $hide is optional - function showTab(clicked, $show, $hide) { - if (!(o.fxSlide || o.fxFade || o.fxShow)) { - $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels - } - $show.animate(showAnim, showSpeed, function() { - $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. - if ($.browser.msie && showAnim['opacity']) { - $show[0].style.filter = ''; - } - o.show(clicked, $show[0], $hide && $hide[0] || null); - }); - } - - // switch a tab - function switchTab(clicked, $li, $hide, $show) { - /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click - $.ajaxHistory.update(clicked.hash); - }*/ - $li.addClass(o.selectedClass) - .siblings().removeClass(o.selectedClass); - hideTab(clicked, $hide, $show); - } - - // attach tab event handler, unbind to avoid duplicates from former tabifying... - this.$tabs.unbind(o.event).bind(o.event, function() { - - //var trueClick = e.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 = $(this.hash); - - // If tab is already selected and not unselectable or tab disabled or click callback returns false stop here. - // Check if click handler returns false last so that it is not executed for a disabled tab! - if (($li.hasClass(o.selectedClass) && !o.unselect) || $li.hasClass(o.disabledClass) - || o.click(this, $show[0], $hide[0]) === false) { - this.blur(); - return false; - } - - if (o.cookie) { - $.cookie($.ui.tabs.INSTANCE_KEY + $.data(self.source), self.$tabs.index(this), o.cookie); - } - - // if tab may be closed - if (o.unselect) { - if ($li.hasClass(o.selectedClass)) { - $li.removeClass(o.selectedClass); - self.$panels.stop(); - hideTab(this, $hide); - this.blur(); - return false; - } else if (!$hide.length) { - self.$panels.stop(); - if ($.data(this, 'href')) { // remote tab - var a = this; - self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() { - $li.addClass(o.selectedClass).addClass(o.unselectClass); - showTab(a, $show); - }); - } else { - $li.addClass(o.selectedClass).addClass(o.unselectClass); - showTab(this, $show); - } - this.blur(); - return false; - } - } - - // stop possibly running animations - self.$panels.stop(); - - // show new tab - if ($show.length) { - - // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled - /*if ($.browser.msie && o.bookmarkable) { - var showId = this.hash.replace('#', ''); - $show.attr('id', ''); - setTimeout(function() { - $show.attr('id', showId); // restore id - }, 0); - }*/ - - if ($.data(this, 'href')) { // remote tab - var a = this; - self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() { - switchTab(a, $li, $hide, $show); - }); - } else { - switchTab(this, $li, $hide, $show); - } - - // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash - /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0; - var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0; - setTimeout(function() { - scrollTo(scrollX, scrollY); - }, 0);*/ - - } 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 in modern - // browsers via CSS, also blur removes focus from address bar in Firefox - // which can become a usability and annoying problem with tabsRotate. - if ($.browser.msie) { - this.blur(); - } - - //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE - return false; - - }); - - }, - add: function(url, text, position) { - if (url && text) { - position = position || this.$tabs.length; // append by default - - var o = this.options, - $li = $(o.tabTemplate.replace(/#\{href\}/, url).replace(/#\{text\}/, text)); - - 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); - $panel = $panel.length && $panel - || $(o.panelTemplate).attr('id', id).addClass(o.panelClass).addClass(o.hideClass); - if (position >= this.$lis.length) { - $li.appendTo(this.source); - $panel.appendTo(this.source.parentNode); - } else { - $li.insertBefore(this.$lis[position - 1]); - $panel.insertBefore(this.$panels[position - 1]); - } - - this.tabify(); - - if (this.$tabs.length == 1) { - $li.addClass(o.selectedClass); - $panel.removeClass(o.hideClass); - var href = $.data(this.$tabs[0], 'href'); - if (href) { - this.load(position + 1, href); - } - } - o.add(this.$tabs[position], this.$panels[position]); // callback - } else { - throw 'jQuery UI Tabs: Not enough arguments to add tab.'; - } - }, - remove: function(position) { - if (position && position.constructor == Number) { - var o = this.options, $li = this.$lis.eq(position - 1).remove(), - $panel = this.$panels.eq(position - 1).remove(); - - // If selected tab was removed focus tab to the right or - // tab to the left if last tab was removed. - if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) { - this.click(position + (position < this.$tabs.length ? 1 : -1)); - } - this.tabify(); - o.remove($li.end()[0], $panel[0]); // callback - } - }, - enable: function(position) { - var o = this.options, $li = this.$lis.eq(position - 1); - $li.removeClass(o.disabledClass); - if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... - $li.css('display', 'inline-block'); - setTimeout(function() { - $li.css('display', 'block') - }, 0) - } - o.enable(this.$tabs[position - 1], this.$panels[position - 1]); // callback - }, - disable: function(position) { - var o = this.options; - this.$lis.eq(position - 1).addClass(o.disabledClass); - o.disable(this.$tabs[position - 1], this.$panels[position - 1]); // callback - }, - click: function(position) { - this.$tabs.eq(position - 1).trigger(this.options.event); - }, - load: function(position, url, callback) { - var self = this, o = this.options, - $a = this.$tabs.eq(position - 1), a = $a[0], $span = $('span', a); - - // shift arguments - if (url && url.constructor == Function) { - callback = url; - url = null; - } - - // set new URL or get existing - if (url) { - $.data(a, 'href', url); - } else { - url = $.data(a, 'href'); - } - - // load - if (o.spinner) { - $.data(a, 'title', $span.html()); - $span.html('' + o.spinner + ''); - } - var finish = function() { - self.$tabs.filter('.' + o.loadingClass).each(function() { - $(this).removeClass(o.loadingClass); - if (o.spinner) { - $('span', this).html( $.data(this, 'title') ); - } - }); - self.xhr = null; - }; - var ajaxOptions = $.extend(o.ajaxOptions, { - url: url, - success: function(r) { - $(a.hash).html(r); - finish(); - // This callback is required because the switch has to take - // place after loading has completed. - if (callback && callback.constructor == Function) { - callback(); - } - if (o.cache) { - $.removeData(a, 'href'); // if loaded once do not load them again - } - o.load(self.$tabs[position - 1], self.$panels[position - 1]); // callback - } - }); - if (this.xhr) { - // terminate pending requests from other tabs and restore title - this.xhr.abort(); - finish(); - } - $a.addClass(o.loadingClass); - setTimeout(function() { // timeout is again required in IE, "wait" for id being restored - self.xhr = $.ajax(ajaxOptions); - }, 0); - - }, - href: function(position, href) { - $.data(this.$tabs.eq(position - 1)[0], 'href', href); - } - }); + /* + * Rotate + */ + $.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) { // only in case of a true click + clearInterval(self.rotation); + } + } + + // start interval + if (ms) { + start(); + if (!continuing) + this.$tabs.bind(this.options.event, stop); + else + this.$tabs.bind(this.options.event, function() { + stop(); + t = self.options.selected; + start(); + }); + } + // stop interval + else { + stop(); + this.$tabs.unbind(this.options.event, stop); + } + } + }); })(jQuery); diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 7f95f0f25d..9a7bf5a81a 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -108,7 +108,8 @@ class WP_Scripts { 'deleted' => __('Deleted'), ) ); - $this->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui.tabs.js', array('jquery'), '3' ); + $this->add( 'jquery-ui-core', '/wp-includes/js/jquery/ui.core.js', array('jquery'), '1.5b4' ); + $this->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui.tabs.js', array('jquery-ui-core'), '1.5b4' ); if ( is_admin() ) { $this->add( 'ajaxcat', '/wp-admin/js/cat.js', array( 'wp-lists' ), '20071101' );