Currently, MediaWiki has a mess of resources, some but not all of which are upstream libraries.
This means that occasionally people will attempt to make local modifications of the libraries
by accident, or deliberately but do not flag it, making dependency management a challenge (and
fixing upstream-related bugs a headache).
Instead, we now split the /resources directory into a /resources/lib directory for those items
which are used purely as intact upstream libraries, and a /resources/src directroy for those
which are either local libraries written for MediaWiki and mastered here, or downstream forks
of upstream libraries which require particular care and attention when being upgraded. Also,
some incidental files which are not to be loaded as part of a module have been moved to better
locations.
Upstream libaries
* jquery
resources/jquery/jquery.js
* jquery.appear
resources/jquery/jquery.appear.js
* jquery.async
resources/jquery/jquery.async.js
* jquery.chosen
resources/jquery.chosen/*
* jquery.cookie
resources/jquery/jquery.cookie.js
* jquery.form
resources/jquery/jquery.form.js
* jquery.fullscreen.js
resources/jquery/jquery.fullscreen.js
* jquery.hoverIntent
resources/jquery/jquery.hoverIntent.js
* jquery.json
resources/jquery/jquery.json.js
* jquery.mockjax
resources/jquery/jquery.mockjax.js
* jquery.qunit
resources/jquery/jquery.qunit.css
resources/jquery/jquery.qunit.js
* jquery.jStorage
resources/jquery/jquery.jStorage.js
* jquery.throttle-debounce
resources/jquery/jquery.ba-throttle-debounce.js
* jquery.validate
resources/jquery/jquery.validate.js
* jquery.xmldom
resources/jquery/jquery.xmldom.js
* moment
resources/moment/*
* OOjs
resource/oojs/*
* OOjs UI
resources/oojs-ui/*
* jquery.ui.*
resources/jquery.ui/*
resources/jquery.ui/themes/default moved to resources/lib/jquery.ui/themes/
resources/jquery.ui/themes/vector moved to resources/src/jquery.ui-themes/
* jquery.effects.*
resources/jquery.effects/*
* sinon
resources/sinonjs/*
Upstream libraries forked for MediaWiki
* jquery.color
resources/jquery/jquery.color.js
* jquery.tipsy
resources/jquery.tipsy/*
Local libraries
* jquery.arrowSteps
resources/jquery/jquery.arrowSteps.css
resources/jquery/jquery.arrowSteps.js
resources/jquery/images/jquery.arrowSteps.divider-ltr.png
resources/jquery/images/jquery.arrowSteps.divider-rtl.png
resources/jquery/images/jquery.arrowSteps.head-ltr.png
resources/jquery/images/jquery.arrowSteps.head-rtl.png
resources/jquery/images/jquery.arrowSteps.tail-ltr.png
resources/jquery/images/jquery.arrowSteps.tail-rtl.png
* jquery.autoEllipsis
resources/jquery/jquery.autoEllipsis.js
* jquery.badge
resources/jquery/jquery.badge.css
resources/jquery/jquery.badge.js
* jquery.byteLength
resources/jquery/jquery.byteLength.js
* jquery.byteLimit
resources/jquery/jquery.byteLimit.js
* jquery.checkboxShiftClick
resources/jquery/jquery.checkboxShiftClick.js
* jquery.client
resources/jquery/jquery.client.js
* jquery.colorUtil
resources/jquery/jquery.colorUtil.js
* jquery.delayedBind
resources/jquery/jquery.delayedBind.js
* jquery.expandableField
resources/jquery/jquery.expandableField.js
* jquery.farbtastic
resources/jquery/jquery.farbtastic.css
resources/jquery/jquery.farbtastic.js
resources/jquery/images/marker.png
resources/jquery/images/mask.png
resources/jquery/images/wheel.png
* jquery.footHovzer
resources/jquery/jquery.footHovzer.css
resources/jquery/jquery.footHovzer.js
* jquery.getAttrs
resources/jquery/jquery.getAttrs.js
* jquery.hidpi
resources/jquery/jquery.hidpi.js
* jquery.highlightText
resources/jquery/jquery.highlightText.js
* jquery.localize
resources/jquery/jquery.localize.js
* jquery.makeCollapsible
resources/jquery/jquery.makeCollapsible.css
resources/jquery/jquery.makeCollapsible.js
* jquery.mw-jump
resources/jquery/jquery.mw-jump.js
* jquery.mwExtension
resources/jquery/jquery.mwExtension.js
* jquery.placeholder
resources/jquery/jquery.placeholder.js
* jquery.spinner
resources/jquery/jquery.spinner.css
resources/jquery/jquery.spinner.js
resources/jquery/images/spinner-large.gif
resources/jquery/images/spinner.gif
* jquery.suggestions
resources/jquery/jquery.suggestions.css
resources/jquery/jquery.suggestions.js
* jquery.tabIndex
resources/jquery/jquery.tabIndex.js
* jquery.tablesorter
resources/jquery/jquery.tablesorter.css
resources/jquery/jquery.tablesorter.js
resources/jquery/images/sort_both.gif
resources/jquery/images/sort_down.gif
resources/jquery/images/sort_none.gif
resources/jquery/images/sort_up.gif
* jquery.textSelection
resources/jquery/jquery.textSelection.js
* jquery.qunit.completenessTest
resources/jquery/jquery.qunit.completenessTest.js
* mediawiki
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
* mediawiki.api
resources/mediawiki.api/mediawiki.api.js
* mediawiki.api.category
resources/mediawiki.api/mediawiki.api.category.js
* mediawiki.api.edit
resources/mediawiki.api/mediawiki.api.edit.js
* mediawiki.api.login
resources/mediawiki.api/mediawiki.api.login.js
* mediawiki.api.parse
resources/mediawiki.api/mediawiki.api.parse.js
* mediawiki.api.watch
resources/mediawiki.api/mediawiki.api.watch.js
* mediawiki.debug
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.debug.less
resources/mediawiki/mediawiki.debug.profile.css
resources/mediawiki/mediawiki.debug.profile.js
* mediawiki.debug.init
resources/mediawiki/mediawiki.debug.init.js
* mediawiki.feedback
resources/mediawiki/mediawiki.feedback.css
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.feedback.spinner.gif
* mediawiki.hidpi
resources/mediawiki/mediawiki.hidpi.js
* mediawiki.hlist
resources/mediawiki/mediawiki.hlist.css
resources/mediawiki/mediawiki.hlist.js
* mediawiki.htmlform
resources/mediawiki/mediawiki.htmlform.js
* mediawiki.icon
resources/mediawiki/mediawiki.icon.less
resources/mediawiki/images/arrow-collapsed-ltr.png
resources/mediawiki/images/arrow-collapsed-ltr.svg
resources/mediawiki/images/arrow-collapsed-rtl.png
resources/mediawiki/images/arrow-collapsed-rtl.svg
resources/mediawiki/images/arrow-expanded.png
resources/mediawiki/images/arrow-expanded.svg
* mediawiki.inspect
resources/mediawiki/mediawiki.inspect.js
* mediawiki.notification
resources/mediawiki/mediawiki.notification.css
resources/mediawiki/mediawiki.notification.hideForPrint.css
resources/mediawiki/mediawiki.notification.js
* mediawiki.notify
resources/mediawiki/mediawiki.notify.js
* mediawiki.searchSuggest
resources/mediawiki/mediawiki.searchSuggest.css
resources/mediawiki/mediawiki.searchSuggest.js
* mediawiki.Title
resources/mediawiki/mediawiki.Title.js
* mediawiki.toc
resources/mediawiki/mediawiki.toc.js
* mediawiki.Uri
resources/mediawiki/mediawiki.Uri.js
* mediawiki.user
resources/mediawiki/mediawiki.user.js
* mediawiki.util
resources/mediawiki/mediawiki.util.js
* mediawiki.action.edit
resources/mediawiki.action/mediawiki.action.edit.js
* mediawiki.action.edit.styles
resources/mediawiki.action/mediawiki.action.edit.styles.css
* mediawiki.action.edit.collapsibleFooter
resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
* mediawiki.action.edit.preview
resources/mediawiki.action/mediawiki.action.edit.preview.js
* mediawiki.action.history
resources/mediawiki.action/mediawiki.action.history.js
* mediawiki.action.history.diff
resources/mediawiki.action/mediawiki.action.history.diff.css
* mediawiki.action.view.dblClickEdit
resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
* mediawiki.action.view.metadata
resources/mediawiki.action/mediawiki.action.view.metadata.js
* mediawiki.action.view.postEdit
resources/mediawiki.action/mediawiki.action.view.postEdit.css
resources/mediawiki.action/mediawiki.action.view.postEdit.js
resources/mediawiki.action/images/green-checkmark.png
* mediawiki.action.view.redirectToFragment
resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js
* mediawiki.action.view.rightClickEdit
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
* mediawiki.action.edit.editWarning
resources/mediawiki.action/mediawiki.action.edit.editWarning.js
* mediawiki.action.watch.ajax
No files associated with this resource.
* mediawiki.language
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.language/mediawiki.language.numbers.js
resources/mediawiki.language/languages/bs.js
resources/mediawiki.language/languages/dsb.js
resources/mediawiki.language/languages/fi.js
resources/mediawiki.language/languages/ga.js
resources/mediawiki.language/languages/he.js
resources/mediawiki.language/languages/hsb.js
resources/mediawiki.language/languages/hu.js
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/la.js
resources/mediawiki.language/languages/os.js
resources/mediawiki.language/languages/ru.js
resources/mediawiki.language/languages/sl.js
resources/mediawiki.language/languages/uk.js
* mediawiki.cldr
resources/mediawiki.language/mediawiki.cldr.js
* mediawiki.libs.pluralruleparser
Possibly should be moved to /lib
resources/mediawiki.libs/CLDRPluralRuleParser.js
* mediawiki.language.init
resources/mediawiki.language/mediawiki.language.init.js
* mediawiki.jqueryMsg
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.jqueryMsg.peg
* mediawiki.language.months
resources/mediawiki.language/mediawiki.language.months.js
* mediawiki.libs.jpegmeta
resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
* mediawiki.page.gallery
resources/mediawiki.page/mediawiki.page.gallery.js
* mediawiki.page.ready
resources/mediawiki.page/mediawiki.page.ready.js
* mediawiki.page.startup
resources/mediawiki.page/mediawiki.page.startup.js
* mediawiki.page.patrol.ajax
resources/mediawiki.page/mediawiki.page.patrol.ajax.js
* mediawiki.page.watch.ajax
resources/mediawiki.page/mediawiki.page.watch.ajax.js
* mediawiki.page.image.pagination
resources/mediawiki.page/mediawiki.page.image.pagination.js
* mediawiki.special
resources/mediawiki.special/mediawiki.special.css
resources/mediawiki.special/mediawiki.special.js
* mediawiki.special.block
resources/mediawiki.special/mediawiki.special.block.css
resources/mediawiki.special/mediawiki.special.block.js
* mediawiki.special.changeemail
resources/mediawiki.special/mediawiki.special.changeemail.css
resources/mediawiki.special/mediawiki.special.changeemail.js
* mediawiki.special.changeslist
resources/mediawiki.special/mediawiki.special.changeslist.css
* mediawiki.special.changeslist.legend
resources/mediawiki.special/mediawiki.special.changeslist.legend.css
* mediawiki.special.changeslist.legend.js
resources/mediawiki.special/mediawiki.special.changeslist.legend.js
* mediawiki.special.changeslist.enhanced
resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
* mediawiki.special.movePage
resources/mediawiki.special/mediawiki.special.movePage.js
* mediawiki.special.pagesWithProp
resources/mediawiki.special/mediawiki.special.pagesWithProp.css
* mediawiki.special.preferences
resources/mediawiki.special/mediawiki.special.preferences.css
resources/mediawiki.special/mediawiki.special.preferences.js
* mediawiki.special.recentchanges
resources/mediawiki.special/mediawiki.special.recentchanges.js
* mediawiki.special.search
resources/mediawiki.special/mediawiki.special.search.css
resources/mediawiki.special/mediawiki.special.search.js
* mediawiki.special.undelete
resources/mediawiki.special/mediawiki.special.undelete.js
* mediawiki.special.upload
resources/mediawiki.special/mediawiki.special.upload.js
* mediawiki.special.userlogin.common.styles
resources/mediawiki.special/mediawiki.special.userlogin.common.css
resources/mediawiki.special/images/icon-lock.png
* mediawiki.special.userlogin.signup.styles
resources/mediawiki.special/mediawiki.special.userlogin.signup.css
resources/mediawiki.special/images/icon-edits.png
resources/mediawiki.special/images/icon-pages.png
resources/mediawiki.special/images/icon-contributors.png
* mediawiki.special.userlogin.login.styles
resources/mediawiki.special/mediawiki.special.userlogin.login.css
resources/mediawiki.special/images/glyph-people-large.png
* mediawiki.special.userlogin.common.js
resources/mediawiki.special/mediawiki.special.userlogin.common.js
* mediawiki.special.userlogin.signup.js
resources/mediawiki.special/mediawiki.special.userlogin.signup.js
* mediawiki.special.javaScriptTest
resources/mediawiki.special/mediawiki.special.javaScriptTest.js
* mediawiki.special.version
resources/mediawiki.special/mediawiki.special.version.css
* mediawiki.ui
resources/mediawiki.ui/default.less
resources/mediawiki.ui/vector.less
resources/mediawiki.ui/components/utilities.less
resources/mediawiki.ui/components/default/forms.less
resources/mediawiki.ui/components/vector/containers.less
resources/mediawiki.ui/components/vector/forms.less
resources/mediawiki.ui/mixins/effects.less
resources/mediawiki.ui/mixins/forms.less
resources/mediawiki.ui/mixins/type.less
resources/mediawiki.ui/mixins/utilities.less
resources/mediawiki.ui/settings/colors.less
resources/mediawiki.ui/settings/typography.less
resources/mediawiki.ui/styleguide.md
* mediawiki.ui.button
resources/mediawiki.ui/components/default/buttons.less
resources/mediawiki.ui/components/vector/buttons.less
Legacy modules, untouched:
* mediawiki.legacy.ajax
* mediawiki.legacy.commonPrint
* mediawiki.legacy.config
* mediawiki.legacy.protect
* mediawiki.legacy.shared
* mediawiki.legacy.oldshared
* mediawiki.legacy.upload
* mediawiki.legacy.wikibits
Miscellaneous files moved elsewhere
* A currently-failing (unused?) script attempting to build some kss style documentation.
Previously in the root of the resources directory, now moved to a new folder, /docs/kss.
Makefile
README.txt
package.json
scripts/nodecheck.sh
styleguide-template/index.html
styleguide-template/public/kss.less
styleguide-template/public/less.js
* ResourceLoader startup JS code was also moved to /src
resources/startup.js
* mediawiki.mixins, hard-coded to be loaded by ResourceLoader, also moved to /src
resources/mediawiki.less/mediawiki.mixins.animation.less
resources/mediawiki.less/mediawiki.mixins.less
resources/mediawiki.less/mediawiki.mixins.rotation.less
* jquery.cycle.all.js appears not to be refered to (?!):
(added in 2f1f0abc6b)
resources/jquery/jquery.cycle.all.js
Change-Id: Id5ead1453412e763bdb3763084e43694517088fd
866 lines
21 KiB
JavaScript
866 lines
21 KiB
JavaScript
/*!
|
|
* jQuery UI Dialog 1.8.24
|
|
*
|
|
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*
|
|
* http://docs.jquery.com/UI/Dialog
|
|
*
|
|
* Depends:
|
|
* jquery.ui.core.js
|
|
* jquery.ui.widget.js
|
|
* jquery.ui.button.js
|
|
* jquery.ui.draggable.js
|
|
* jquery.ui.mouse.js
|
|
* jquery.ui.position.js
|
|
* jquery.ui.resizable.js
|
|
*/
|
|
(function( $, undefined ) {
|
|
|
|
var uiDialogClasses =
|
|
'ui-dialog ' +
|
|
'ui-widget ' +
|
|
'ui-widget-content ' +
|
|
'ui-corner-all ',
|
|
sizeRelatedOptions = {
|
|
buttons: true,
|
|
height: true,
|
|
maxHeight: true,
|
|
maxWidth: true,
|
|
minHeight: true,
|
|
minWidth: true,
|
|
width: true
|
|
},
|
|
resizableRelatedOptions = {
|
|
maxHeight: true,
|
|
maxWidth: true,
|
|
minHeight: true,
|
|
minWidth: true
|
|
};
|
|
|
|
$.widget("ui.dialog", {
|
|
options: {
|
|
autoOpen: true,
|
|
buttons: {},
|
|
closeOnEscape: true,
|
|
closeText: 'close',
|
|
dialogClass: '',
|
|
draggable: true,
|
|
hide: null,
|
|
height: 'auto',
|
|
maxHeight: false,
|
|
maxWidth: false,
|
|
minHeight: 150,
|
|
minWidth: 150,
|
|
modal: false,
|
|
position: {
|
|
my: 'center',
|
|
at: 'center',
|
|
collision: 'fit',
|
|
// ensure that the titlebar is never outside the document
|
|
using: function(pos) {
|
|
var topOffset = $(this).css(pos).offset().top;
|
|
if (topOffset < 0) {
|
|
$(this).css('top', pos.top - topOffset);
|
|
}
|
|
}
|
|
},
|
|
resizable: true,
|
|
show: null,
|
|
stack: true,
|
|
title: '',
|
|
width: 300,
|
|
zIndex: 1000
|
|
},
|
|
|
|
_create: function() {
|
|
this.originalTitle = this.element.attr('title');
|
|
// #5742 - .attr() might return a DOMElement
|
|
if ( typeof this.originalTitle !== "string" ) {
|
|
this.originalTitle = "";
|
|
}
|
|
|
|
this.options.title = this.options.title || this.originalTitle;
|
|
var self = this,
|
|
options = self.options,
|
|
|
|
title = options.title || ' ',
|
|
titleId = $.ui.dialog.getTitleId(self.element),
|
|
|
|
uiDialog = (self.uiDialog = $('<div></div>'))
|
|
.appendTo(document.body)
|
|
.hide()
|
|
.addClass(uiDialogClasses + options.dialogClass)
|
|
.css({
|
|
zIndex: options.zIndex
|
|
})
|
|
// setting tabIndex makes the div focusable
|
|
// setting outline to 0 prevents a border on focus in Mozilla
|
|
.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
|
|
if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
|
|
event.keyCode === $.ui.keyCode.ESCAPE) {
|
|
|
|
self.close(event);
|
|
event.preventDefault();
|
|
}
|
|
})
|
|
.attr({
|
|
role: 'dialog',
|
|
'aria-labelledby': titleId
|
|
})
|
|
.mousedown(function(event) {
|
|
self.moveToTop(false, event);
|
|
}),
|
|
|
|
uiDialogContent = self.element
|
|
.show()
|
|
.removeAttr('title')
|
|
.addClass(
|
|
'ui-dialog-content ' +
|
|
'ui-widget-content')
|
|
.appendTo(uiDialog),
|
|
|
|
uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
|
|
.addClass(
|
|
'ui-dialog-titlebar ' +
|
|
'ui-widget-header ' +
|
|
'ui-corner-all ' +
|
|
'ui-helper-clearfix'
|
|
)
|
|
.prependTo(uiDialog),
|
|
|
|
uiDialogTitlebarClose = $('<a href="#"></a>')
|
|
.addClass(
|
|
'ui-dialog-titlebar-close ' +
|
|
'ui-corner-all'
|
|
)
|
|
.attr('role', 'button')
|
|
.hover(
|
|
function() {
|
|
uiDialogTitlebarClose.addClass('ui-state-hover');
|
|
},
|
|
function() {
|
|
uiDialogTitlebarClose.removeClass('ui-state-hover');
|
|
}
|
|
)
|
|
.focus(function() {
|
|
uiDialogTitlebarClose.addClass('ui-state-focus');
|
|
})
|
|
.blur(function() {
|
|
uiDialogTitlebarClose.removeClass('ui-state-focus');
|
|
})
|
|
.click(function(event) {
|
|
self.close(event);
|
|
return false;
|
|
})
|
|
.appendTo(uiDialogTitlebar),
|
|
|
|
uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
|
|
.addClass(
|
|
'ui-icon ' +
|
|
'ui-icon-closethick'
|
|
)
|
|
.text(options.closeText)
|
|
.appendTo(uiDialogTitlebarClose),
|
|
|
|
uiDialogTitle = $('<span></span>')
|
|
.addClass('ui-dialog-title')
|
|
.attr('id', titleId)
|
|
.html(title)
|
|
.prependTo(uiDialogTitlebar);
|
|
|
|
//handling of deprecated beforeclose (vs beforeClose) option
|
|
//Ticket #4669 http://dev.jqueryui.com/ticket/4669
|
|
//TODO: remove in 1.9pre
|
|
if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
|
|
options.beforeClose = options.beforeclose;
|
|
}
|
|
|
|
uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
|
|
|
|
if (options.draggable && $.fn.draggable) {
|
|
self._makeDraggable();
|
|
}
|
|
if (options.resizable && $.fn.resizable) {
|
|
self._makeResizable();
|
|
}
|
|
|
|
self._createButtons(options.buttons);
|
|
self._isOpen = false;
|
|
|
|
if ($.fn.bgiframe) {
|
|
uiDialog.bgiframe();
|
|
}
|
|
},
|
|
|
|
_init: function() {
|
|
if ( this.options.autoOpen ) {
|
|
this.open();
|
|
}
|
|
},
|
|
|
|
destroy: function() {
|
|
var self = this;
|
|
|
|
if (self.overlay) {
|
|
self.overlay.destroy();
|
|
}
|
|
self.uiDialog.hide();
|
|
self.element
|
|
.unbind('.dialog')
|
|
.removeData('dialog')
|
|
.removeClass('ui-dialog-content ui-widget-content')
|
|
.hide().appendTo('body');
|
|
self.uiDialog.remove();
|
|
|
|
if (self.originalTitle) {
|
|
self.element.attr('title', self.originalTitle);
|
|
}
|
|
|
|
return self;
|
|
},
|
|
|
|
widget: function() {
|
|
return this.uiDialog;
|
|
},
|
|
|
|
close: function(event) {
|
|
var self = this,
|
|
maxZ, thisZ;
|
|
|
|
if (false === self._trigger('beforeClose', event)) {
|
|
return;
|
|
}
|
|
|
|
if (self.overlay) {
|
|
self.overlay.destroy();
|
|
}
|
|
self.uiDialog.unbind('keypress.ui-dialog');
|
|
|
|
self._isOpen = false;
|
|
|
|
if (self.options.hide) {
|
|
self.uiDialog.hide(self.options.hide, function() {
|
|
self._trigger('close', event);
|
|
});
|
|
} else {
|
|
self.uiDialog.hide();
|
|
self._trigger('close', event);
|
|
}
|
|
|
|
$.ui.dialog.overlay.resize();
|
|
|
|
// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
|
|
if (self.options.modal) {
|
|
maxZ = 0;
|
|
$('.ui-dialog').each(function() {
|
|
if (this !== self.uiDialog[0]) {
|
|
thisZ = $(this).css('z-index');
|
|
if(!isNaN(thisZ)) {
|
|
maxZ = Math.max(maxZ, thisZ);
|
|
}
|
|
}
|
|
});
|
|
$.ui.dialog.maxZ = maxZ;
|
|
}
|
|
|
|
return self;
|
|
},
|
|
|
|
isOpen: function() {
|
|
return this._isOpen;
|
|
},
|
|
|
|
// the force parameter allows us to move modal dialogs to their correct
|
|
// position on open
|
|
moveToTop: function(force, event) {
|
|
var self = this,
|
|
options = self.options,
|
|
saveScroll;
|
|
|
|
if ((options.modal && !force) ||
|
|
(!options.stack && !options.modal)) {
|
|
return self._trigger('focus', event);
|
|
}
|
|
|
|
if (options.zIndex > $.ui.dialog.maxZ) {
|
|
$.ui.dialog.maxZ = options.zIndex;
|
|
}
|
|
if (self.overlay) {
|
|
$.ui.dialog.maxZ += 1;
|
|
self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
|
|
}
|
|
|
|
//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
|
|
// http://ui.jquery.com/bugs/ticket/3193
|
|
saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
|
|
$.ui.dialog.maxZ += 1;
|
|
self.uiDialog.css('z-index', $.ui.dialog.maxZ);
|
|
self.element.attr(saveScroll);
|
|
self._trigger('focus', event);
|
|
|
|
return self;
|
|
},
|
|
|
|
open: function() {
|
|
if (this._isOpen) { return; }
|
|
|
|
var self = this,
|
|
options = self.options,
|
|
uiDialog = self.uiDialog;
|
|
|
|
self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
|
|
self._size();
|
|
self._position(options.position);
|
|
uiDialog.show(options.show);
|
|
self.moveToTop(true);
|
|
|
|
// prevent tabbing out of modal dialogs
|
|
if ( options.modal ) {
|
|
uiDialog.bind( "keydown.ui-dialog", function( event ) {
|
|
if ( event.keyCode !== $.ui.keyCode.TAB ) {
|
|
return;
|
|
}
|
|
|
|
var tabbables = $(':tabbable', this),
|
|
first = tabbables.filter(':first'),
|
|
last = tabbables.filter(':last');
|
|
|
|
if (event.target === last[0] && !event.shiftKey) {
|
|
first.focus(1);
|
|
return false;
|
|
} else if (event.target === first[0] && event.shiftKey) {
|
|
last.focus(1);
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
|
|
// set focus to the first tabbable element in the content area or the first button
|
|
// if there are no tabbable elements, set focus on the dialog itself
|
|
$(self.element.find(':tabbable').get().concat(
|
|
uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
|
|
uiDialog.get()))).eq(0).focus();
|
|
|
|
self._isOpen = true;
|
|
self._trigger('open');
|
|
|
|
return self;
|
|
},
|
|
|
|
_createButtons: function(buttons) {
|
|
var self = this,
|
|
hasButtons = false,
|
|
uiDialogButtonPane = $('<div></div>')
|
|
.addClass(
|
|
'ui-dialog-buttonpane ' +
|
|
'ui-widget-content ' +
|
|
'ui-helper-clearfix'
|
|
),
|
|
uiButtonSet = $( "<div></div>" )
|
|
.addClass( "ui-dialog-buttonset" )
|
|
.appendTo( uiDialogButtonPane );
|
|
|
|
// if we already have a button pane, remove it
|
|
self.uiDialog.find('.ui-dialog-buttonpane').remove();
|
|
|
|
if (typeof buttons === 'object' && buttons !== null) {
|
|
$.each(buttons, function() {
|
|
return !(hasButtons = true);
|
|
});
|
|
}
|
|
if (hasButtons) {
|
|
$.each(buttons, function(name, props) {
|
|
props = $.isFunction( props ) ?
|
|
{ click: props, text: name } :
|
|
props;
|
|
var button = $('<button type="button"></button>')
|
|
.click(function() {
|
|
props.click.apply(self.element[0], arguments);
|
|
})
|
|
.appendTo(uiButtonSet);
|
|
// can't use .attr( props, true ) with jQuery 1.3.2.
|
|
$.each( props, function( key, value ) {
|
|
if ( key === "click" ) {
|
|
return;
|
|
}
|
|
if ( key in button ) {
|
|
button[ key ]( value );
|
|
} else {
|
|
button.attr( key, value );
|
|
}
|
|
});
|
|
if ($.fn.button) {
|
|
button.button();
|
|
}
|
|
});
|
|
uiDialogButtonPane.appendTo(self.uiDialog);
|
|
}
|
|
},
|
|
|
|
_makeDraggable: function() {
|
|
var self = this,
|
|
options = self.options,
|
|
doc = $(document),
|
|
heightBeforeDrag;
|
|
|
|
function filteredUi(ui) {
|
|
return {
|
|
position: ui.position,
|
|
offset: ui.offset
|
|
};
|
|
}
|
|
|
|
self.uiDialog.draggable({
|
|
cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
|
|
handle: '.ui-dialog-titlebar',
|
|
containment: 'document',
|
|
start: function(event, ui) {
|
|
heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
|
|
$(this).height($(this).height()).addClass("ui-dialog-dragging");
|
|
self._trigger('dragStart', event, filteredUi(ui));
|
|
},
|
|
drag: function(event, ui) {
|
|
self._trigger('drag', event, filteredUi(ui));
|
|
},
|
|
stop: function(event, ui) {
|
|
options.position = [ui.position.left - doc.scrollLeft(),
|
|
ui.position.top - doc.scrollTop()];
|
|
$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
|
|
self._trigger('dragStop', event, filteredUi(ui));
|
|
$.ui.dialog.overlay.resize();
|
|
}
|
|
});
|
|
},
|
|
|
|
_makeResizable: function(handles) {
|
|
handles = (handles === undefined ? this.options.resizable : handles);
|
|
var self = this,
|
|
options = self.options,
|
|
// .ui-resizable has position: relative defined in the stylesheet
|
|
// but dialogs have to use absolute or fixed positioning
|
|
position = self.uiDialog.css('position'),
|
|
resizeHandles = (typeof handles === 'string' ?
|
|
handles :
|
|
'n,e,s,w,se,sw,ne,nw'
|
|
);
|
|
|
|
function filteredUi(ui) {
|
|
return {
|
|
originalPosition: ui.originalPosition,
|
|
originalSize: ui.originalSize,
|
|
position: ui.position,
|
|
size: ui.size
|
|
};
|
|
}
|
|
|
|
self.uiDialog.resizable({
|
|
cancel: '.ui-dialog-content',
|
|
containment: 'document',
|
|
alsoResize: self.element,
|
|
maxWidth: options.maxWidth,
|
|
maxHeight: options.maxHeight,
|
|
minWidth: options.minWidth,
|
|
minHeight: self._minHeight(),
|
|
handles: resizeHandles,
|
|
start: function(event, ui) {
|
|
$(this).addClass("ui-dialog-resizing");
|
|
self._trigger('resizeStart', event, filteredUi(ui));
|
|
},
|
|
resize: function(event, ui) {
|
|
self._trigger('resize', event, filteredUi(ui));
|
|
},
|
|
stop: function(event, ui) {
|
|
$(this).removeClass("ui-dialog-resizing");
|
|
options.height = $(this).height();
|
|
options.width = $(this).width();
|
|
self._trigger('resizeStop', event, filteredUi(ui));
|
|
$.ui.dialog.overlay.resize();
|
|
}
|
|
})
|
|
.css('position', position)
|
|
.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
|
|
},
|
|
|
|
_minHeight: function() {
|
|
var options = this.options;
|
|
|
|
if (options.height === 'auto') {
|
|
return options.minHeight;
|
|
} else {
|
|
return Math.min(options.minHeight, options.height);
|
|
}
|
|
},
|
|
|
|
_position: function(position) {
|
|
var myAt = [],
|
|
offset = [0, 0],
|
|
isVisible;
|
|
|
|
if (position) {
|
|
// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
|
|
// if (typeof position == 'string' || $.isArray(position)) {
|
|
// myAt = $.isArray(position) ? position : position.split(' ');
|
|
|
|
if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
|
|
myAt = position.split ? position.split(' ') : [position[0], position[1]];
|
|
if (myAt.length === 1) {
|
|
myAt[1] = myAt[0];
|
|
}
|
|
|
|
$.each(['left', 'top'], function(i, offsetPosition) {
|
|
if (+myAt[i] === myAt[i]) {
|
|
offset[i] = myAt[i];
|
|
myAt[i] = offsetPosition;
|
|
}
|
|
});
|
|
|
|
position = {
|
|
my: myAt.join(" "),
|
|
at: myAt.join(" "),
|
|
offset: offset.join(" ")
|
|
};
|
|
}
|
|
|
|
position = $.extend({}, $.ui.dialog.prototype.options.position, position);
|
|
} else {
|
|
position = $.ui.dialog.prototype.options.position;
|
|
}
|
|
|
|
// need to show the dialog to get the actual offset in the position plugin
|
|
isVisible = this.uiDialog.is(':visible');
|
|
if (!isVisible) {
|
|
this.uiDialog.show();
|
|
}
|
|
this.uiDialog
|
|
// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
|
|
.css({ top: 0, left: 0 })
|
|
.position($.extend({ of: window }, position));
|
|
if (!isVisible) {
|
|
this.uiDialog.hide();
|
|
}
|
|
},
|
|
|
|
_setOptions: function( options ) {
|
|
var self = this,
|
|
resizableOptions = {},
|
|
resize = false;
|
|
|
|
$.each( options, function( key, value ) {
|
|
self._setOption( key, value );
|
|
|
|
if ( key in sizeRelatedOptions ) {
|
|
resize = true;
|
|
}
|
|
if ( key in resizableRelatedOptions ) {
|
|
resizableOptions[ key ] = value;
|
|
}
|
|
});
|
|
|
|
if ( resize ) {
|
|
this._size();
|
|
}
|
|
if ( this.uiDialog.is( ":data(resizable)" ) ) {
|
|
this.uiDialog.resizable( "option", resizableOptions );
|
|
}
|
|
},
|
|
|
|
_setOption: function(key, value){
|
|
var self = this,
|
|
uiDialog = self.uiDialog;
|
|
|
|
switch (key) {
|
|
//handling of deprecated beforeclose (vs beforeClose) option
|
|
//Ticket #4669 http://dev.jqueryui.com/ticket/4669
|
|
//TODO: remove in 1.9pre
|
|
case "beforeclose":
|
|
key = "beforeClose";
|
|
break;
|
|
case "buttons":
|
|
self._createButtons(value);
|
|
break;
|
|
case "closeText":
|
|
// ensure that we always pass a string
|
|
self.uiDialogTitlebarCloseText.text("" + value);
|
|
break;
|
|
case "dialogClass":
|
|
uiDialog
|
|
.removeClass(self.options.dialogClass)
|
|
.addClass(uiDialogClasses + value);
|
|
break;
|
|
case "disabled":
|
|
if (value) {
|
|
uiDialog.addClass('ui-dialog-disabled');
|
|
} else {
|
|
uiDialog.removeClass('ui-dialog-disabled');
|
|
}
|
|
break;
|
|
case "draggable":
|
|
var isDraggable = uiDialog.is( ":data(draggable)" );
|
|
if ( isDraggable && !value ) {
|
|
uiDialog.draggable( "destroy" );
|
|
}
|
|
|
|
if ( !isDraggable && value ) {
|
|
self._makeDraggable();
|
|
}
|
|
break;
|
|
case "position":
|
|
self._position(value);
|
|
break;
|
|
case "resizable":
|
|
// currently resizable, becoming non-resizable
|
|
var isResizable = uiDialog.is( ":data(resizable)" );
|
|
if (isResizable && !value) {
|
|
uiDialog.resizable('destroy');
|
|
}
|
|
|
|
// currently resizable, changing handles
|
|
if (isResizable && typeof value === 'string') {
|
|
uiDialog.resizable('option', 'handles', value);
|
|
}
|
|
|
|
// currently non-resizable, becoming resizable
|
|
if (!isResizable && value !== false) {
|
|
self._makeResizable(value);
|
|
}
|
|
break;
|
|
case "title":
|
|
// convert whatever was passed in o a string, for html() to not throw up
|
|
$(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || ' '));
|
|
break;
|
|
}
|
|
|
|
$.Widget.prototype._setOption.apply(self, arguments);
|
|
},
|
|
|
|
_size: function() {
|
|
/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
|
|
* divs will both have width and height set, so we need to reset them
|
|
*/
|
|
var options = this.options,
|
|
nonContentHeight,
|
|
minContentHeight,
|
|
isVisible = this.uiDialog.is( ":visible" );
|
|
|
|
// reset content sizing
|
|
this.element.show().css({
|
|
width: 'auto',
|
|
minHeight: 0,
|
|
height: 0
|
|
});
|
|
|
|
if (options.minWidth > options.width) {
|
|
options.width = options.minWidth;
|
|
}
|
|
|
|
// reset wrapper sizing
|
|
// determine the height of all the non-content elements
|
|
nonContentHeight = this.uiDialog.css({
|
|
height: 'auto',
|
|
width: options.width
|
|
})
|
|
.height();
|
|
minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
|
|
|
|
if ( options.height === "auto" ) {
|
|
// only needed for IE6 support
|
|
if ( $.support.minHeight ) {
|
|
this.element.css({
|
|
minHeight: minContentHeight,
|
|
height: "auto"
|
|
});
|
|
} else {
|
|
this.uiDialog.show();
|
|
var autoHeight = this.element.css( "height", "auto" ).height();
|
|
if ( !isVisible ) {
|
|
this.uiDialog.hide();
|
|
}
|
|
this.element.height( Math.max( autoHeight, minContentHeight ) );
|
|
}
|
|
} else {
|
|
this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
|
|
}
|
|
|
|
if (this.uiDialog.is(':data(resizable)')) {
|
|
this.uiDialog.resizable('option', 'minHeight', this._minHeight());
|
|
}
|
|
}
|
|
});
|
|
|
|
$.extend($.ui.dialog, {
|
|
version: "1.8.24",
|
|
|
|
uuid: 0,
|
|
maxZ: 0,
|
|
|
|
getTitleId: function($el) {
|
|
var id = $el.attr('id');
|
|
if (!id) {
|
|
this.uuid += 1;
|
|
id = this.uuid;
|
|
}
|
|
return 'ui-dialog-title-' + id;
|
|
},
|
|
|
|
overlay: function(dialog) {
|
|
this.$el = $.ui.dialog.overlay.create(dialog);
|
|
}
|
|
});
|
|
|
|
$.extend($.ui.dialog.overlay, {
|
|
instances: [],
|
|
// reuse old instances due to IE memory leak with alpha transparency (see #5185)
|
|
oldInstances: [],
|
|
maxZ: 0,
|
|
events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
|
|
function(event) { return event + '.dialog-overlay'; }).join(' '),
|
|
create: function(dialog) {
|
|
if (this.instances.length === 0) {
|
|
// prevent use of anchors and inputs
|
|
// we use a setTimeout in case the overlay is created from an
|
|
// event that we're going to be cancelling (see #2804)
|
|
setTimeout(function() {
|
|
// handle $(el).dialog().dialog('close') (see #4065)
|
|
if ($.ui.dialog.overlay.instances.length) {
|
|
$(document).bind($.ui.dialog.overlay.events, function(event) {
|
|
// stop events if the z-index of the target is < the z-index of the overlay
|
|
// we cannot return true when we don't want to cancel the event (#3523)
|
|
if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
}, 1);
|
|
|
|
// allow closing by pressing the escape key
|
|
$(document).bind('keydown.dialog-overlay', function(event) {
|
|
if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
|
|
event.keyCode === $.ui.keyCode.ESCAPE) {
|
|
|
|
dialog.close(event);
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
|
|
// handle window resize
|
|
$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
|
|
}
|
|
|
|
var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
|
|
.appendTo(document.body)
|
|
.css({
|
|
width: this.width(),
|
|
height: this.height()
|
|
});
|
|
|
|
if ($.fn.bgiframe) {
|
|
$el.bgiframe();
|
|
}
|
|
|
|
this.instances.push($el);
|
|
return $el;
|
|
},
|
|
|
|
destroy: function($el) {
|
|
var indexOf = $.inArray($el, this.instances);
|
|
if (indexOf != -1){
|
|
this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
|
|
}
|
|
|
|
if (this.instances.length === 0) {
|
|
$([document, window]).unbind('.dialog-overlay');
|
|
}
|
|
|
|
$el.remove();
|
|
|
|
// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
|
|
var maxZ = 0;
|
|
$.each(this.instances, function() {
|
|
maxZ = Math.max(maxZ, this.css('z-index'));
|
|
});
|
|
this.maxZ = maxZ;
|
|
},
|
|
|
|
height: function() {
|
|
var scrollHeight,
|
|
offsetHeight;
|
|
// handle IE 6
|
|
if ($.browser.msie && $.browser.version < 7) {
|
|
scrollHeight = Math.max(
|
|
document.documentElement.scrollHeight,
|
|
document.body.scrollHeight
|
|
);
|
|
offsetHeight = Math.max(
|
|
document.documentElement.offsetHeight,
|
|
document.body.offsetHeight
|
|
);
|
|
|
|
if (scrollHeight < offsetHeight) {
|
|
return $(window).height() + 'px';
|
|
} else {
|
|
return scrollHeight + 'px';
|
|
}
|
|
// handle "good" browsers
|
|
} else {
|
|
return $(document).height() + 'px';
|
|
}
|
|
},
|
|
|
|
width: function() {
|
|
var scrollWidth,
|
|
offsetWidth;
|
|
// handle IE
|
|
if ( $.browser.msie ) {
|
|
scrollWidth = Math.max(
|
|
document.documentElement.scrollWidth,
|
|
document.body.scrollWidth
|
|
);
|
|
offsetWidth = Math.max(
|
|
document.documentElement.offsetWidth,
|
|
document.body.offsetWidth
|
|
);
|
|
|
|
if (scrollWidth < offsetWidth) {
|
|
return $(window).width() + 'px';
|
|
} else {
|
|
return scrollWidth + 'px';
|
|
}
|
|
// handle "good" browsers
|
|
} else {
|
|
return $(document).width() + 'px';
|
|
}
|
|
},
|
|
|
|
resize: function() {
|
|
/* If the dialog is draggable and the user drags it past the
|
|
* right edge of the window, the document becomes wider so we
|
|
* need to stretch the overlay. If the user then drags the
|
|
* dialog back to the left, the document will become narrower,
|
|
* so we need to shrink the overlay to the appropriate size.
|
|
* This is handled by shrinking the overlay before setting it
|
|
* to the full document size.
|
|
*/
|
|
var $overlays = $([]);
|
|
$.each($.ui.dialog.overlay.instances, function() {
|
|
$overlays = $overlays.add(this);
|
|
});
|
|
|
|
$overlays.css({
|
|
width: 0,
|
|
height: 0
|
|
}).css({
|
|
width: $.ui.dialog.overlay.width(),
|
|
height: $.ui.dialog.overlay.height()
|
|
});
|
|
}
|
|
});
|
|
|
|
$.extend($.ui.dialog.overlay.prototype, {
|
|
destroy: function() {
|
|
$.ui.dialog.overlay.destroy(this.$el);
|
|
}
|
|
});
|
|
|
|
}(jQuery));
|