Mercurial > hg > STI-GWT
comparison war/scripts/jQuery/ui/jquery.ui.dialog.js @ 3:cf06b77a8bbd
Committed branch of the e4D repos sti-gwt branch 16384.
git-svn-id: http://dev.dariah.eu/svn/repos/eu.dariah.de/ap1/sti-gwt-dariah-geobrowser@36 f2b5be40-def6-11e0-8a09-b3c1cc336c6b
author | StefanFunk <StefanFunk@f2b5be40-def6-11e0-8a09-b3c1cc336c6b> |
---|---|
date | Tue, 17 Jul 2012 13:34:40 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:2897af43ccc6 | 3:cf06b77a8bbd |
---|---|
1 /* | |
2 * jQuery UI Dialog 1.8.14 | |
3 * | |
4 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) | |
5 * Dual licensed under the MIT or GPL Version 2 licenses. | |
6 * http://jquery.org/license | |
7 * | |
8 * http://docs.jquery.com/UI/Dialog | |
9 * | |
10 * Depends: | |
11 * jquery.ui.core.js | |
12 * jquery.ui.widget.js | |
13 * jquery.ui.button.js | |
14 * jquery.ui.draggable.js | |
15 * jquery.ui.mouse.js | |
16 * jquery.ui.position.js | |
17 * jquery.ui.resizable.js | |
18 */ | |
19 (function( $, undefined ) { | |
20 | |
21 var uiDialogClasses = | |
22 'ui-dialog ' + | |
23 'ui-widget ' + | |
24 'ui-widget-content ' + | |
25 'ui-corner-all ', | |
26 sizeRelatedOptions = { | |
27 buttons: true, | |
28 height: true, | |
29 maxHeight: true, | |
30 maxWidth: true, | |
31 minHeight: true, | |
32 minWidth: true, | |
33 width: true | |
34 }, | |
35 resizableRelatedOptions = { | |
36 maxHeight: true, | |
37 maxWidth: true, | |
38 minHeight: true, | |
39 minWidth: true | |
40 }, | |
41 // support for jQuery 1.3.2 - handle common attrFn methods for dialog | |
42 attrFn = $.attrFn || { | |
43 val: true, | |
44 css: true, | |
45 html: true, | |
46 text: true, | |
47 data: true, | |
48 width: true, | |
49 height: true, | |
50 offset: true, | |
51 click: true | |
52 }; | |
53 | |
54 $.widget("ui.dialog", { | |
55 options: { | |
56 autoOpen: true, | |
57 buttons: {}, | |
58 closeOnEscape: true, | |
59 closeText: 'close', | |
60 dialogClass: '', | |
61 draggable: true, | |
62 hide: null, | |
63 height: 'auto', | |
64 maxHeight: false, | |
65 maxWidth: false, | |
66 minHeight: 150, | |
67 minWidth: 150, | |
68 modal: false, | |
69 position: { | |
70 my: 'center', | |
71 at: 'center', | |
72 collision: 'fit', | |
73 // ensure that the titlebar is never outside the document | |
74 using: function(pos) { | |
75 var topOffset = $(this).css(pos).offset().top; | |
76 if (topOffset < 0) { | |
77 $(this).css('top', pos.top - topOffset); | |
78 } | |
79 } | |
80 }, | |
81 resizable: true, | |
82 show: null, | |
83 stack: true, | |
84 title: '', | |
85 width: 300, | |
86 zIndex: 1000 | |
87 }, | |
88 | |
89 _create: function() { | |
90 this.originalTitle = this.element.attr('title'); | |
91 // #5742 - .attr() might return a DOMElement | |
92 if ( typeof this.originalTitle !== "string" ) { | |
93 this.originalTitle = ""; | |
94 } | |
95 | |
96 this.options.title = this.options.title || this.originalTitle; | |
97 var self = this, | |
98 options = self.options, | |
99 | |
100 title = options.title || ' ', | |
101 titleId = $.ui.dialog.getTitleId(self.element), | |
102 | |
103 uiDialog = (self.uiDialog = $('<div></div>')) | |
104 .appendTo(document.body) | |
105 .hide() | |
106 .addClass(uiDialogClasses + options.dialogClass) | |
107 .css({ | |
108 zIndex: options.zIndex | |
109 }) | |
110 // setting tabIndex makes the div focusable | |
111 // setting outline to 0 prevents a border on focus in Mozilla | |
112 .attr('tabIndex', -1).css('outline', 0).keydown(function(event) { | |
113 if (options.closeOnEscape && event.keyCode && | |
114 event.keyCode === $.ui.keyCode.ESCAPE) { | |
115 | |
116 self.close(event); | |
117 event.preventDefault(); | |
118 } | |
119 }) | |
120 .attr({ | |
121 role: 'dialog', | |
122 'aria-labelledby': titleId | |
123 }) | |
124 .mousedown(function(event) { | |
125 self.moveToTop(false, event); | |
126 }), | |
127 | |
128 uiDialogContent = self.element | |
129 .show() | |
130 .removeAttr('title') | |
131 .addClass( | |
132 'ui-dialog-content ' + | |
133 'ui-widget-content') | |
134 .appendTo(uiDialog), | |
135 | |
136 uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>')) | |
137 .addClass( | |
138 'ui-dialog-titlebar ' + | |
139 'ui-widget-header ' + | |
140 'ui-corner-all ' + | |
141 'ui-helper-clearfix' | |
142 ) | |
143 .prependTo(uiDialog), | |
144 | |
145 uiDialogTitlebarClose = $('<a href="#"></a>') | |
146 .addClass( | |
147 'ui-dialog-titlebar-close ' + | |
148 'ui-corner-all' | |
149 ) | |
150 .attr('role', 'button') | |
151 .hover( | |
152 function() { | |
153 uiDialogTitlebarClose.addClass('ui-state-hover'); | |
154 }, | |
155 function() { | |
156 uiDialogTitlebarClose.removeClass('ui-state-hover'); | |
157 } | |
158 ) | |
159 .focus(function() { | |
160 uiDialogTitlebarClose.addClass('ui-state-focus'); | |
161 }) | |
162 .blur(function() { | |
163 uiDialogTitlebarClose.removeClass('ui-state-focus'); | |
164 }) | |
165 .click(function(event) { | |
166 self.close(event); | |
167 return false; | |
168 }) | |
169 .appendTo(uiDialogTitlebar), | |
170 | |
171 uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>')) | |
172 .addClass( | |
173 'ui-icon ' + | |
174 'ui-icon-closethick' | |
175 ) | |
176 .text(options.closeText) | |
177 .appendTo(uiDialogTitlebarClose), | |
178 | |
179 uiDialogTitle = $('<span></span>') | |
180 .addClass('ui-dialog-title') | |
181 .attr('id', titleId) | |
182 .html(title) | |
183 .prependTo(uiDialogTitlebar); | |
184 | |
185 //handling of deprecated beforeclose (vs beforeClose) option | |
186 //Ticket #4669 http://dev.jqueryui.com/ticket/4669 | |
187 //TODO: remove in 1.9pre | |
188 if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) { | |
189 options.beforeClose = options.beforeclose; | |
190 } | |
191 | |
192 uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection(); | |
193 | |
194 if (options.draggable && $.fn.draggable) { | |
195 self._makeDraggable(); | |
196 } | |
197 if (options.resizable && $.fn.resizable) { | |
198 self._makeResizable(); | |
199 } | |
200 | |
201 self._createButtons(options.buttons); | |
202 self._isOpen = false; | |
203 | |
204 if ($.fn.bgiframe) { | |
205 uiDialog.bgiframe(); | |
206 } | |
207 }, | |
208 | |
209 _init: function() { | |
210 if ( this.options.autoOpen ) { | |
211 this.open(); | |
212 } | |
213 }, | |
214 | |
215 destroy: function() { | |
216 var self = this; | |
217 | |
218 if (self.overlay) { | |
219 self.overlay.destroy(); | |
220 } | |
221 self.uiDialog.hide(); | |
222 self.element | |
223 .unbind('.dialog') | |
224 .removeData('dialog') | |
225 .removeClass('ui-dialog-content ui-widget-content') | |
226 .hide().appendTo('body'); | |
227 self.uiDialog.remove(); | |
228 | |
229 if (self.originalTitle) { | |
230 self.element.attr('title', self.originalTitle); | |
231 } | |
232 | |
233 return self; | |
234 }, | |
235 | |
236 widget: function() { | |
237 return this.uiDialog; | |
238 }, | |
239 | |
240 close: function(event) { | |
241 var self = this, | |
242 maxZ, thisZ; | |
243 | |
244 if (false === self._trigger('beforeClose', event)) { | |
245 return; | |
246 } | |
247 | |
248 if (self.overlay) { | |
249 self.overlay.destroy(); | |
250 } | |
251 self.uiDialog.unbind('keypress.ui-dialog'); | |
252 | |
253 self._isOpen = false; | |
254 | |
255 if (self.options.hide) { | |
256 self.uiDialog.hide(self.options.hide, function() { | |
257 self._trigger('close', event); | |
258 }); | |
259 } else { | |
260 self.uiDialog.hide(); | |
261 self._trigger('close', event); | |
262 } | |
263 | |
264 $.ui.dialog.overlay.resize(); | |
265 | |
266 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) | |
267 if (self.options.modal) { | |
268 maxZ = 0; | |
269 $('.ui-dialog').each(function() { | |
270 if (this !== self.uiDialog[0]) { | |
271 thisZ = $(this).css('z-index'); | |
272 if(!isNaN(thisZ)) { | |
273 maxZ = Math.max(maxZ, thisZ); | |
274 } | |
275 } | |
276 }); | |
277 $.ui.dialog.maxZ = maxZ; | |
278 } | |
279 | |
280 return self; | |
281 }, | |
282 | |
283 isOpen: function() { | |
284 return this._isOpen; | |
285 }, | |
286 | |
287 // the force parameter allows us to move modal dialogs to their correct | |
288 // position on open | |
289 moveToTop: function(force, event) { | |
290 var self = this, | |
291 options = self.options, | |
292 saveScroll; | |
293 | |
294 if ((options.modal && !force) || | |
295 (!options.stack && !options.modal)) { | |
296 return self._trigger('focus', event); | |
297 } | |
298 | |
299 if (options.zIndex > $.ui.dialog.maxZ) { | |
300 $.ui.dialog.maxZ = options.zIndex; | |
301 } | |
302 if (self.overlay) { | |
303 $.ui.dialog.maxZ += 1; | |
304 self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ); | |
305 } | |
306 | |
307 //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed. | |
308 // http://ui.jquery.com/bugs/ticket/3193 | |
309 saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') }; | |
310 $.ui.dialog.maxZ += 1; | |
311 self.uiDialog.css('z-index', $.ui.dialog.maxZ); | |
312 self.element.attr(saveScroll); | |
313 self._trigger('focus', event); | |
314 | |
315 return self; | |
316 }, | |
317 | |
318 open: function() { | |
319 if (this._isOpen) { return; } | |
320 | |
321 var self = this, | |
322 options = self.options, | |
323 uiDialog = self.uiDialog; | |
324 | |
325 self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null; | |
326 self._size(); | |
327 self._position(options.position); | |
328 uiDialog.show(options.show); | |
329 self.moveToTop(true); | |
330 | |
331 // prevent tabbing out of modal dialogs | |
332 if (options.modal) { | |
333 uiDialog.bind('keypress.ui-dialog', function(event) { | |
334 if (event.keyCode !== $.ui.keyCode.TAB) { | |
335 return; | |
336 } | |
337 | |
338 var tabbables = $(':tabbable', this), | |
339 first = tabbables.filter(':first'), | |
340 last = tabbables.filter(':last'); | |
341 | |
342 if (event.target === last[0] && !event.shiftKey) { | |
343 first.focus(1); | |
344 return false; | |
345 } else if (event.target === first[0] && event.shiftKey) { | |
346 last.focus(1); | |
347 return false; | |
348 } | |
349 }); | |
350 } | |
351 | |
352 // set focus to the first tabbable element in the content area or the first button | |
353 // if there are no tabbable elements, set focus on the dialog itself | |
354 $(self.element.find(':tabbable').get().concat( | |
355 uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat( | |
356 uiDialog.get()))).eq(0).focus(); | |
357 | |
358 self._isOpen = true; | |
359 self._trigger('open'); | |
360 | |
361 return self; | |
362 }, | |
363 | |
364 _createButtons: function(buttons) { | |
365 var self = this, | |
366 hasButtons = false, | |
367 uiDialogButtonPane = $('<div></div>') | |
368 .addClass( | |
369 'ui-dialog-buttonpane ' + | |
370 'ui-widget-content ' + | |
371 'ui-helper-clearfix' | |
372 ), | |
373 uiButtonSet = $( "<div></div>" ) | |
374 .addClass( "ui-dialog-buttonset" ) | |
375 .appendTo( uiDialogButtonPane ); | |
376 | |
377 // if we already have a button pane, remove it | |
378 self.uiDialog.find('.ui-dialog-buttonpane').remove(); | |
379 | |
380 if (typeof buttons === 'object' && buttons !== null) { | |
381 $.each(buttons, function() { | |
382 return !(hasButtons = true); | |
383 }); | |
384 } | |
385 if (hasButtons) { | |
386 $.each(buttons, function(name, props) { | |
387 props = $.isFunction( props ) ? | |
388 { click: props, text: name } : | |
389 props; | |
390 var button = $('<button type="button"></button>') | |
391 .click(function() { | |
392 props.click.apply(self.element[0], arguments); | |
393 }) | |
394 .appendTo(uiButtonSet); | |
395 // can't use .attr( props, true ) with jQuery 1.3.2. | |
396 $.each( props, function( key, value ) { | |
397 if ( key === "click" ) { | |
398 return; | |
399 } | |
400 if ( key in attrFn ) { | |
401 button[ key ]( value ); | |
402 } else { | |
403 button.attr( key, value ); | |
404 } | |
405 }); | |
406 if ($.fn.button) { | |
407 button.button(); | |
408 } | |
409 }); | |
410 uiDialogButtonPane.appendTo(self.uiDialog); | |
411 } | |
412 }, | |
413 | |
414 _makeDraggable: function() { | |
415 var self = this, | |
416 options = self.options, | |
417 doc = $(document), | |
418 heightBeforeDrag; | |
419 | |
420 function filteredUi(ui) { | |
421 return { | |
422 position: ui.position, | |
423 offset: ui.offset | |
424 }; | |
425 } | |
426 | |
427 self.uiDialog.draggable({ | |
428 cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', | |
429 handle: '.ui-dialog-titlebar', | |
430 containment: 'document', | |
431 start: function(event, ui) { | |
432 heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height(); | |
433 $(this).height($(this).height()).addClass("ui-dialog-dragging"); | |
434 self._trigger('dragStart', event, filteredUi(ui)); | |
435 }, | |
436 drag: function(event, ui) { | |
437 self._trigger('drag', event, filteredUi(ui)); | |
438 }, | |
439 stop: function(event, ui) { | |
440 options.position = [ui.position.left - doc.scrollLeft(), | |
441 ui.position.top - doc.scrollTop()]; | |
442 $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag); | |
443 self._trigger('dragStop', event, filteredUi(ui)); | |
444 $.ui.dialog.overlay.resize(); | |
445 } | |
446 }); | |
447 }, | |
448 | |
449 _makeResizable: function(handles) { | |
450 handles = (handles === undefined ? this.options.resizable : handles); | |
451 var self = this, | |
452 options = self.options, | |
453 // .ui-resizable has position: relative defined in the stylesheet | |
454 // but dialogs have to use absolute or fixed positioning | |
455 position = self.uiDialog.css('position'), | |
456 resizeHandles = (typeof handles === 'string' ? | |
457 handles : | |
458 'n,e,s,w,se,sw,ne,nw' | |
459 ); | |
460 | |
461 function filteredUi(ui) { | |
462 return { | |
463 originalPosition: ui.originalPosition, | |
464 originalSize: ui.originalSize, | |
465 position: ui.position, | |
466 size: ui.size | |
467 }; | |
468 } | |
469 | |
470 self.uiDialog.resizable({ | |
471 cancel: '.ui-dialog-content', | |
472 containment: 'document', | |
473 alsoResize: self.element, | |
474 maxWidth: options.maxWidth, | |
475 maxHeight: options.maxHeight, | |
476 minWidth: options.minWidth, | |
477 minHeight: self._minHeight(), | |
478 handles: resizeHandles, | |
479 start: function(event, ui) { | |
480 $(this).addClass("ui-dialog-resizing"); | |
481 self._trigger('resizeStart', event, filteredUi(ui)); | |
482 }, | |
483 resize: function(event, ui) { | |
484 self._trigger('resize', event, filteredUi(ui)); | |
485 }, | |
486 stop: function(event, ui) { | |
487 $(this).removeClass("ui-dialog-resizing"); | |
488 options.height = $(this).height(); | |
489 options.width = $(this).width(); | |
490 self._trigger('resizeStop', event, filteredUi(ui)); | |
491 $.ui.dialog.overlay.resize(); | |
492 } | |
493 }) | |
494 .css('position', position) | |
495 .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se'); | |
496 }, | |
497 | |
498 _minHeight: function() { | |
499 var options = this.options; | |
500 | |
501 if (options.height === 'auto') { | |
502 return options.minHeight; | |
503 } else { | |
504 return Math.min(options.minHeight, options.height); | |
505 } | |
506 }, | |
507 | |
508 _position: function(position) { | |
509 var myAt = [], | |
510 offset = [0, 0], | |
511 isVisible; | |
512 | |
513 if (position) { | |
514 // deep extending converts arrays to objects in jQuery <= 1.3.2 :-( | |
515 // if (typeof position == 'string' || $.isArray(position)) { | |
516 // myAt = $.isArray(position) ? position : position.split(' '); | |
517 | |
518 if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) { | |
519 myAt = position.split ? position.split(' ') : [position[0], position[1]]; | |
520 if (myAt.length === 1) { | |
521 myAt[1] = myAt[0]; | |
522 } | |
523 | |
524 $.each(['left', 'top'], function(i, offsetPosition) { | |
525 if (+myAt[i] === myAt[i]) { | |
526 offset[i] = myAt[i]; | |
527 myAt[i] = offsetPosition; | |
528 } | |
529 }); | |
530 | |
531 position = { | |
532 my: myAt.join(" "), | |
533 at: myAt.join(" "), | |
534 offset: offset.join(" ") | |
535 }; | |
536 } | |
537 | |
538 position = $.extend({}, $.ui.dialog.prototype.options.position, position); | |
539 } else { | |
540 position = $.ui.dialog.prototype.options.position; | |
541 } | |
542 | |
543 // need to show the dialog to get the actual offset in the position plugin | |
544 isVisible = this.uiDialog.is(':visible'); | |
545 if (!isVisible) { | |
546 this.uiDialog.show(); | |
547 } | |
548 this.uiDialog | |
549 // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 | |
550 .css({ top: 0, left: 0 }) | |
551 .position($.extend({ of: window }, position)); | |
552 if (!isVisible) { | |
553 this.uiDialog.hide(); | |
554 } | |
555 }, | |
556 | |
557 _setOptions: function( options ) { | |
558 var self = this, | |
559 resizableOptions = {}, | |
560 resize = false; | |
561 | |
562 $.each( options, function( key, value ) { | |
563 self._setOption( key, value ); | |
564 | |
565 if ( key in sizeRelatedOptions ) { | |
566 resize = true; | |
567 } | |
568 if ( key in resizableRelatedOptions ) { | |
569 resizableOptions[ key ] = value; | |
570 } | |
571 }); | |
572 | |
573 if ( resize ) { | |
574 this._size(); | |
575 } | |
576 if ( this.uiDialog.is( ":data(resizable)" ) ) { | |
577 this.uiDialog.resizable( "option", resizableOptions ); | |
578 } | |
579 }, | |
580 | |
581 _setOption: function(key, value){ | |
582 var self = this, | |
583 uiDialog = self.uiDialog; | |
584 | |
585 switch (key) { | |
586 //handling of deprecated beforeclose (vs beforeClose) option | |
587 //Ticket #4669 http://dev.jqueryui.com/ticket/4669 | |
588 //TODO: remove in 1.9pre | |
589 case "beforeclose": | |
590 key = "beforeClose"; | |
591 break; | |
592 case "buttons": | |
593 self._createButtons(value); | |
594 break; | |
595 case "closeText": | |
596 // ensure that we always pass a string | |
597 self.uiDialogTitlebarCloseText.text("" + value); | |
598 break; | |
599 case "dialogClass": | |
600 uiDialog | |
601 .removeClass(self.options.dialogClass) | |
602 .addClass(uiDialogClasses + value); | |
603 break; | |
604 case "disabled": | |
605 if (value) { | |
606 uiDialog.addClass('ui-dialog-disabled'); | |
607 } else { | |
608 uiDialog.removeClass('ui-dialog-disabled'); | |
609 } | |
610 break; | |
611 case "draggable": | |
612 var isDraggable = uiDialog.is( ":data(draggable)" ); | |
613 if ( isDraggable && !value ) { | |
614 uiDialog.draggable( "destroy" ); | |
615 } | |
616 | |
617 if ( !isDraggable && value ) { | |
618 self._makeDraggable(); | |
619 } | |
620 break; | |
621 case "position": | |
622 self._position(value); | |
623 break; | |
624 case "resizable": | |
625 // currently resizable, becoming non-resizable | |
626 var isResizable = uiDialog.is( ":data(resizable)" ); | |
627 if (isResizable && !value) { | |
628 uiDialog.resizable('destroy'); | |
629 } | |
630 | |
631 // currently resizable, changing handles | |
632 if (isResizable && typeof value === 'string') { | |
633 uiDialog.resizable('option', 'handles', value); | |
634 } | |
635 | |
636 // currently non-resizable, becoming resizable | |
637 if (!isResizable && value !== false) { | |
638 self._makeResizable(value); | |
639 } | |
640 break; | |
641 case "title": | |
642 // convert whatever was passed in o a string, for html() to not throw up | |
643 $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || ' ')); | |
644 break; | |
645 } | |
646 | |
647 $.Widget.prototype._setOption.apply(self, arguments); | |
648 }, | |
649 | |
650 _size: function() { | |
651 /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content | |
652 * divs will both have width and height set, so we need to reset them | |
653 */ | |
654 var options = this.options, | |
655 nonContentHeight, | |
656 minContentHeight, | |
657 isVisible = this.uiDialog.is( ":visible" ); | |
658 | |
659 // reset content sizing | |
660 this.element.show().css({ | |
661 width: 'auto', | |
662 minHeight: 0, | |
663 height: 0 | |
664 }); | |
665 | |
666 if (options.minWidth > options.width) { | |
667 options.width = options.minWidth; | |
668 } | |
669 | |
670 // reset wrapper sizing | |
671 // determine the height of all the non-content elements | |
672 nonContentHeight = this.uiDialog.css({ | |
673 height: 'auto', | |
674 width: options.width | |
675 }) | |
676 .height(); | |
677 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight ); | |
678 | |
679 if ( options.height === "auto" ) { | |
680 // only needed for IE6 support | |
681 if ( $.support.minHeight ) { | |
682 this.element.css({ | |
683 minHeight: minContentHeight, | |
684 height: "auto" | |
685 }); | |
686 } else { | |
687 this.uiDialog.show(); | |
688 var autoHeight = this.element.css( "height", "auto" ).height(); | |
689 if ( !isVisible ) { | |
690 this.uiDialog.hide(); | |
691 } | |
692 this.element.height( Math.max( autoHeight, minContentHeight ) ); | |
693 } | |
694 } else { | |
695 this.element.height( Math.max( options.height - nonContentHeight, 0 ) ); | |
696 } | |
697 | |
698 if (this.uiDialog.is(':data(resizable)')) { | |
699 this.uiDialog.resizable('option', 'minHeight', this._minHeight()); | |
700 } | |
701 } | |
702 }); | |
703 | |
704 $.extend($.ui.dialog, { | |
705 version: "1.8.14", | |
706 | |
707 uuid: 0, | |
708 maxZ: 0, | |
709 | |
710 getTitleId: function($el) { | |
711 var id = $el.attr('id'); | |
712 if (!id) { | |
713 this.uuid += 1; | |
714 id = this.uuid; | |
715 } | |
716 return 'ui-dialog-title-' + id; | |
717 }, | |
718 | |
719 overlay: function(dialog) { | |
720 this.$el = $.ui.dialog.overlay.create(dialog); | |
721 } | |
722 }); | |
723 | |
724 $.extend($.ui.dialog.overlay, { | |
725 instances: [], | |
726 // reuse old instances due to IE memory leak with alpha transparency (see #5185) | |
727 oldInstances: [], | |
728 maxZ: 0, | |
729 events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), | |
730 function(event) { return event + '.dialog-overlay'; }).join(' '), | |
731 create: function(dialog) { | |
732 if (this.instances.length === 0) { | |
733 // prevent use of anchors and inputs | |
734 // we use a setTimeout in case the overlay is created from an | |
735 // event that we're going to be cancelling (see #2804) | |
736 setTimeout(function() { | |
737 // handle $(el).dialog().dialog('close') (see #4065) | |
738 if ($.ui.dialog.overlay.instances.length) { | |
739 $(document).bind($.ui.dialog.overlay.events, function(event) { | |
740 // stop events if the z-index of the target is < the z-index of the overlay | |
741 // we cannot return true when we don't want to cancel the event (#3523) | |
742 if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) { | |
743 return false; | |
744 } | |
745 }); | |
746 } | |
747 }, 1); | |
748 | |
749 // allow closing by pressing the escape key | |
750 $(document).bind('keydown.dialog-overlay', function(event) { | |
751 if (dialog.options.closeOnEscape && event.keyCode && | |
752 event.keyCode === $.ui.keyCode.ESCAPE) { | |
753 | |
754 dialog.close(event); | |
755 event.preventDefault(); | |
756 } | |
757 }); | |
758 | |
759 // handle window resize | |
760 $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); | |
761 } | |
762 | |
763 var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay')) | |
764 .appendTo(document.body) | |
765 .css({ | |
766 width: this.width(), | |
767 height: this.height() | |
768 }); | |
769 | |
770 if ($.fn.bgiframe) { | |
771 $el.bgiframe(); | |
772 } | |
773 | |
774 this.instances.push($el); | |
775 return $el; | |
776 }, | |
777 | |
778 destroy: function($el) { | |
779 var indexOf = $.inArray($el, this.instances); | |
780 if (indexOf != -1){ | |
781 this.oldInstances.push(this.instances.splice(indexOf, 1)[0]); | |
782 } | |
783 | |
784 if (this.instances.length === 0) { | |
785 $([document, window]).unbind('.dialog-overlay'); | |
786 } | |
787 | |
788 $el.remove(); | |
789 | |
790 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) | |
791 var maxZ = 0; | |
792 $.each(this.instances, function() { | |
793 maxZ = Math.max(maxZ, this.css('z-index')); | |
794 }); | |
795 this.maxZ = maxZ; | |
796 }, | |
797 | |
798 height: function() { | |
799 var scrollHeight, | |
800 offsetHeight; | |
801 // handle IE 6 | |
802 if ($.browser.msie && $.browser.version < 7) { | |
803 scrollHeight = Math.max( | |
804 document.documentElement.scrollHeight, | |
805 document.body.scrollHeight | |
806 ); | |
807 offsetHeight = Math.max( | |
808 document.documentElement.offsetHeight, | |
809 document.body.offsetHeight | |
810 ); | |
811 | |
812 if (scrollHeight < offsetHeight) { | |
813 return $(window).height() + 'px'; | |
814 } else { | |
815 return scrollHeight + 'px'; | |
816 } | |
817 // handle "good" browsers | |
818 } else { | |
819 return $(document).height() + 'px'; | |
820 } | |
821 }, | |
822 | |
823 width: function() { | |
824 var scrollWidth, | |
825 offsetWidth; | |
826 // handle IE | |
827 if ( $.browser.msie ) { | |
828 scrollWidth = Math.max( | |
829 document.documentElement.scrollWidth, | |
830 document.body.scrollWidth | |
831 ); | |
832 offsetWidth = Math.max( | |
833 document.documentElement.offsetWidth, | |
834 document.body.offsetWidth | |
835 ); | |
836 | |
837 if (scrollWidth < offsetWidth) { | |
838 return $(window).width() + 'px'; | |
839 } else { | |
840 return scrollWidth + 'px'; | |
841 } | |
842 // handle "good" browsers | |
843 } else { | |
844 return $(document).width() + 'px'; | |
845 } | |
846 }, | |
847 | |
848 resize: function() { | |
849 /* If the dialog is draggable and the user drags it past the | |
850 * right edge of the window, the document becomes wider so we | |
851 * need to stretch the overlay. If the user then drags the | |
852 * dialog back to the left, the document will become narrower, | |
853 * so we need to shrink the overlay to the appropriate size. | |
854 * This is handled by shrinking the overlay before setting it | |
855 * to the full document size. | |
856 */ | |
857 var $overlays = $([]); | |
858 $.each($.ui.dialog.overlay.instances, function() { | |
859 $overlays = $overlays.add(this); | |
860 }); | |
861 | |
862 $overlays.css({ | |
863 width: 0, | |
864 height: 0 | |
865 }).css({ | |
866 width: $.ui.dialog.overlay.width(), | |
867 height: $.ui.dialog.overlay.height() | |
868 }); | |
869 } | |
870 }); | |
871 | |
872 $.extend($.ui.dialog.overlay.prototype, { | |
873 destroy: function() { | |
874 $.ui.dialog.overlay.destroy(this.$el); | |
875 } | |
876 }); | |
877 | |
878 }(jQuery)); |