| [ Index ] |
PHP Cross Reference of Drupal 6 (yi-drupal) |
[Summary view] [Print] [Text view]
1 /* 2 * jQuery UI Dialog 1.7.3 3 * 4 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) 5 * Dual licensed under the MIT (MIT-LICENSE.txt) 6 * and GPL (GPL-LICENSE.txt) licenses. 7 * 8 * http://docs.jquery.com/UI/Dialog 9 * 10 * Depends: 11 * ui.core.js 12 * ui.draggable.js 13 * ui.resizable.js 14 */ 15 (function($) { 16 17 var setDataSwitch = { 18 dragStart: "start.draggable", 19 drag: "drag.draggable", 20 dragStop: "stop.draggable", 21 maxHeight: "maxHeight.resizable", 22 minHeight: "minHeight.resizable", 23 maxWidth: "maxWidth.resizable", 24 minWidth: "minWidth.resizable", 25 resizeStart: "start.resizable", 26 resize: "drag.resizable", 27 resizeStop: "stop.resizable" 28 }, 29 30 uiDialogClasses = 31 'ui-dialog ' + 32 'ui-widget ' + 33 'ui-widget-content ' + 34 'ui-corner-all '; 35 36 $.widget("ui.dialog", { 37 38 _init: function() { 39 this.originalTitle = this.element.attr('title'); 40 41 var self = this, 42 options = this.options, 43 44 title = options.title || this.originalTitle || ' ', 45 titleId = $.ui.dialog.getTitleId(this.element), 46 47 uiDialog = (this.uiDialog = $('<div/>')) 48 .appendTo(document.body) 49 .hide() 50 .addClass(uiDialogClasses + options.dialogClass) 51 .css({ 52 position: 'absolute', 53 overflow: 'hidden', 54 zIndex: options.zIndex 55 }) 56 // setting tabIndex makes the div focusable 57 // setting outline to 0 prevents a border on focus in Mozilla 58 .attr('tabIndex', -1).css('outline', 0).keydown(function(event) { 59 (options.closeOnEscape && event.keyCode 60 && event.keyCode == $.ui.keyCode.ESCAPE && self.close(event)); 61 }) 62 .attr({ 63 role: 'dialog', 64 'aria-labelledby': titleId 65 }) 66 .mousedown(function(event) { 67 self.moveToTop(false, event); 68 }), 69 70 uiDialogContent = this.element 71 .show() 72 .removeAttr('title') 73 .addClass( 74 'ui-dialog-content ' + 75 'ui-widget-content') 76 .appendTo(uiDialog), 77 78 uiDialogTitlebar = (this.uiDialogTitlebar = $('<div></div>')) 79 .addClass( 80 'ui-dialog-titlebar ' + 81 'ui-widget-header ' + 82 'ui-corner-all ' + 83 'ui-helper-clearfix' 84 ) 85 .prependTo(uiDialog), 86 87 uiDialogTitlebarClose = $('<a href="#"/>') 88 .addClass( 89 'ui-dialog-titlebar-close ' + 90 'ui-corner-all' 91 ) 92 .attr('role', 'button') 93 .hover( 94 function() { 95 uiDialogTitlebarClose.addClass('ui-state-hover'); 96 }, 97 function() { 98 uiDialogTitlebarClose.removeClass('ui-state-hover'); 99 } 100 ) 101 .focus(function() { 102 uiDialogTitlebarClose.addClass('ui-state-focus'); 103 }) 104 .blur(function() { 105 uiDialogTitlebarClose.removeClass('ui-state-focus'); 106 }) 107 .mousedown(function(ev) { 108 ev.stopPropagation(); 109 }) 110 .click(function(event) { 111 self.close(event); 112 return false; 113 }) 114 .appendTo(uiDialogTitlebar), 115 116 uiDialogTitlebarCloseText = (this.uiDialogTitlebarCloseText = $('<span/>')) 117 .addClass( 118 'ui-icon ' + 119 'ui-icon-closethick' 120 ) 121 .text(options.closeText) 122 .appendTo(uiDialogTitlebarClose), 123 124 uiDialogTitle = $('<span/>') 125 .addClass('ui-dialog-title') 126 .attr('id', titleId) 127 .html(title) 128 .prependTo(uiDialogTitlebar); 129 130 uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection(); 131 132 (options.draggable && $.fn.draggable && this._makeDraggable()); 133 (options.resizable && $.fn.resizable && this._makeResizable()); 134 135 this._createButtons(options.buttons); 136 this._isOpen = false; 137 138 (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe()); 139 (options.autoOpen && this.open()); 140 141 }, 142 143 destroy: function() { 144 (this.overlay && this.overlay.destroy()); 145 this.uiDialog.hide(); 146 this.element 147 .unbind('.dialog') 148 .removeData('dialog') 149 .removeClass('ui-dialog-content ui-widget-content') 150 .hide().appendTo('body'); 151 this.uiDialog.remove(); 152 153 (this.originalTitle && this.element.attr('title', this.originalTitle)); 154 }, 155 156 close: function(event) { 157 var self = this; 158 159 if (false === self._trigger('beforeclose', event)) { 160 return; 161 } 162 163 (self.overlay && self.overlay.destroy()); 164 self.uiDialog.unbind('keypress.ui-dialog'); 165 166 (self.options.hide 167 ? self.uiDialog.hide(self.options.hide, function() { 168 self._trigger('close', event); 169 }) 170 : self.uiDialog.hide() && self._trigger('close', event)); 171 172 $.ui.dialog.overlay.resize(); 173 174 self._isOpen = false; 175 176 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) 177 if (self.options.modal) { 178 var maxZ = 0; 179 $('.ui-dialog').each(function() { 180 if (this != self.uiDialog[0]) { 181 maxZ = Math.max(maxZ, $(this).css('z-index')); 182 } 183 }); 184 $.ui.dialog.maxZ = maxZ; 185 } 186 }, 187 188 isOpen: function() { 189 return this._isOpen; 190 }, 191 192 // the force parameter allows us to move modal dialogs to their correct 193 // position on open 194 moveToTop: function(force, event) { 195 196 if ((this.options.modal && !force) 197 || (!this.options.stack && !this.options.modal)) { 198 return this._trigger('focus', event); 199 } 200 201 if (this.options.zIndex > $.ui.dialog.maxZ) { 202 $.ui.dialog.maxZ = this.options.zIndex; 203 } 204 (this.overlay && this.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = ++$.ui.dialog.maxZ)); 205 206 //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed. 207 // http://ui.jquery.com/bugs/ticket/3193 208 var saveScroll = { scrollTop: this.element.attr('scrollTop'), scrollLeft: this.element.attr('scrollLeft') }; 209 this.uiDialog.css('z-index', ++$.ui.dialog.maxZ); 210 this.element.attr(saveScroll); 211 this._trigger('focus', event); 212 }, 213 214 open: function() { 215 if (this._isOpen) { return; } 216 217 var options = this.options, 218 uiDialog = this.uiDialog; 219 220 this.overlay = options.modal ? new $.ui.dialog.overlay(this) : null; 221 (uiDialog.next().length && uiDialog.appendTo('body')); 222 this._size(); 223 this._position(options.position); 224 uiDialog.show(options.show); 225 this.moveToTop(true); 226 227 // prevent tabbing out of modal dialogs 228 (options.modal && uiDialog.bind('keypress.ui-dialog', function(event) { 229 if (event.keyCode != $.ui.keyCode.TAB) { 230 return; 231 } 232 233 var tabbables = $(':tabbable', this), 234 first = tabbables.filter(':first')[0], 235 last = tabbables.filter(':last')[0]; 236 237 if (event.target == last && !event.shiftKey) { 238 setTimeout(function() { 239 first.focus(); 240 }, 1); 241 } else if (event.target == first && event.shiftKey) { 242 setTimeout(function() { 243 last.focus(); 244 }, 1); 245 } 246 })); 247 248 // set focus to the first tabbable element in the content area or the first button 249 // if there are no tabbable elements, set focus on the dialog itself 250 $([]) 251 .add(uiDialog.find('.ui-dialog-content :tabbable:first')) 252 .add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first')) 253 .add(uiDialog) 254 .filter(':first') 255 .focus(); 256 257 this._trigger('open'); 258 this._isOpen = true; 259 }, 260 261 _createButtons: function(buttons) { 262 var self = this, 263 hasButtons = false, 264 uiDialogButtonPane = $('<div></div>') 265 .addClass( 266 'ui-dialog-buttonpane ' + 267 'ui-widget-content ' + 268 'ui-helper-clearfix' 269 ); 270 271 // if we already have a button pane, remove it 272 this.uiDialog.find('.ui-dialog-buttonpane').remove(); 273 274 (typeof buttons == 'object' && buttons !== null && 275 $.each(buttons, function() { return !(hasButtons = true); })); 276 if (hasButtons) { 277 $.each(buttons, function(name, fn) { 278 $('<button type="button"></button>') 279 .addClass( 280 'ui-state-default ' + 281 'ui-corner-all' 282 ) 283 .text(name) 284 .click(function() { fn.apply(self.element[0], arguments); }) 285 .hover( 286 function() { 287 $(this).addClass('ui-state-hover'); 288 }, 289 function() { 290 $(this).removeClass('ui-state-hover'); 291 } 292 ) 293 .focus(function() { 294 $(this).addClass('ui-state-focus'); 295 }) 296 .blur(function() { 297 $(this).removeClass('ui-state-focus'); 298 }) 299 .appendTo(uiDialogButtonPane); 300 }); 301 uiDialogButtonPane.appendTo(this.uiDialog); 302 } 303 }, 304 305 _makeDraggable: function() { 306 var self = this, 307 options = this.options, 308 heightBeforeDrag; 309 310 this.uiDialog.draggable({ 311 cancel: '.ui-dialog-content', 312 handle: '.ui-dialog-titlebar', 313 containment: 'document', 314 start: function() { 315 heightBeforeDrag = options.height; 316 $(this).height($(this).height()).addClass("ui-dialog-dragging"); 317 (options.dragStart && options.dragStart.apply(self.element[0], arguments)); 318 }, 319 drag: function() { 320 (options.drag && options.drag.apply(self.element[0], arguments)); 321 }, 322 stop: function() { 323 $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag); 324 (options.dragStop && options.dragStop.apply(self.element[0], arguments)); 325 $.ui.dialog.overlay.resize(); 326 } 327 }); 328 }, 329 330 _makeResizable: function(handles) { 331 handles = (handles === undefined ? this.options.resizable : handles); 332 var self = this, 333 options = this.options, 334 resizeHandles = typeof handles == 'string' 335 ? handles 336 : 'n,e,s,w,se,sw,ne,nw'; 337 338 this.uiDialog.resizable({ 339 cancel: '.ui-dialog-content', 340 alsoResize: this.element, 341 maxWidth: options.maxWidth, 342 maxHeight: options.maxHeight, 343 minWidth: options.minWidth, 344 minHeight: options.minHeight, 345 start: function() { 346 $(this).addClass("ui-dialog-resizing"); 347 (options.resizeStart && options.resizeStart.apply(self.element[0], arguments)); 348 }, 349 resize: function() { 350 (options.resize && options.resize.apply(self.element[0], arguments)); 351 }, 352 handles: resizeHandles, 353 stop: function() { 354 $(this).removeClass("ui-dialog-resizing"); 355 options.height = $(this).height(); 356 options.width = $(this).width(); 357 (options.resizeStop && options.resizeStop.apply(self.element[0], arguments)); 358 $.ui.dialog.overlay.resize(); 359 } 360 }) 361 .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se'); 362 }, 363 364 _position: function(pos) { 365 var wnd = $(window), doc = $(document), 366 pTop = doc.scrollTop(), pLeft = doc.scrollLeft(), 367 minTop = pTop; 368 369 if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) { 370 pos = [ 371 pos == 'right' || pos == 'left' ? pos : 'center', 372 pos == 'top' || pos == 'bottom' ? pos : 'middle' 373 ]; 374 } 375 if (pos.constructor != Array) { 376 pos = ['center', 'middle']; 377 } 378 if (pos[0].constructor == Number) { 379 pLeft += pos[0]; 380 } else { 381 switch (pos[0]) { 382 case 'left': 383 pLeft += 0; 384 break; 385 case 'right': 386 pLeft += wnd.width() - this.uiDialog.outerWidth(); 387 break; 388 default: 389 case 'center': 390 pLeft += (wnd.width() - this.uiDialog.outerWidth()) / 2; 391 } 392 } 393 if (pos[1].constructor == Number) { 394 pTop += pos[1]; 395 } else { 396 switch (pos[1]) { 397 case 'top': 398 pTop += 0; 399 break; 400 case 'bottom': 401 pTop += wnd.height() - this.uiDialog.outerHeight(); 402 break; 403 default: 404 case 'middle': 405 pTop += (wnd.height() - this.uiDialog.outerHeight()) / 2; 406 } 407 } 408 409 // prevent the dialog from being too high (make sure the titlebar 410 // is accessible) 411 pTop = Math.max(pTop, minTop); 412 this.uiDialog.css({top: pTop, left: pLeft}); 413 }, 414 415 _setData: function(key, value){ 416 (setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value)); 417 switch (key) { 418 case "buttons": 419 this._createButtons(value); 420 break; 421 case "closeText": 422 this.uiDialogTitlebarCloseText.text(value); 423 break; 424 case "dialogClass": 425 this.uiDialog 426 .removeClass(this.options.dialogClass) 427 .addClass(uiDialogClasses + value); 428 break; 429 case "draggable": 430 (value 431 ? this._makeDraggable() 432 : this.uiDialog.draggable('destroy')); 433 break; 434 case "height": 435 this.uiDialog.height(value); 436 break; 437 case "position": 438 this._position(value); 439 break; 440 case "resizable": 441 var uiDialog = this.uiDialog, 442 isResizable = this.uiDialog.is(':data(resizable)'); 443 444 // currently resizable, becoming non-resizable 445 (isResizable && !value && uiDialog.resizable('destroy')); 446 447 // currently resizable, changing handles 448 (isResizable && typeof value == 'string' && 449 uiDialog.resizable('option', 'handles', value)); 450 451 // currently non-resizable, becoming resizable 452 (isResizable || this._makeResizable(value)); 453 break; 454 case "title": 455 $(".ui-dialog-title", this.uiDialogTitlebar).html(value || ' '); 456 break; 457 case "width": 458 this.uiDialog.width(value); 459 break; 460 } 461 462 $.widget.prototype._setData.apply(this, arguments); 463 }, 464 465 _size: function() { 466 /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content 467 * divs will both have width and height set, so we need to reset them 468 */ 469 var options = this.options; 470 471 // reset content sizing 472 this.element.css({ 473 height: 0, 474 minHeight: 0, 475 width: 'auto' 476 }); 477 478 // reset wrapper sizing 479 // determine the height of all the non-content elements 480 var nonContentHeight = this.uiDialog.css({ 481 height: 'auto', 482 width: options.width 483 }) 484 .height(); 485 486 this.element 487 .css({ 488 minHeight: Math.max(options.minHeight - nonContentHeight, 0), 489 height: options.height == 'auto' 490 ? 'auto' 491 : Math.max(options.height - nonContentHeight, 0) 492 }); 493 } 494 }); 495 496 $.extend($.ui.dialog, { 497 version: "1.7.3", 498 defaults: { 499 autoOpen: true, 500 bgiframe: false, 501 buttons: {}, 502 closeOnEscape: true, 503 closeText: 'close', 504 dialogClass: '', 505 draggable: true, 506 hide: null, 507 height: 'auto', 508 maxHeight: false, 509 maxWidth: false, 510 minHeight: 150, 511 minWidth: 150, 512 modal: false, 513 position: 'center', 514 resizable: true, 515 show: null, 516 stack: true, 517 title: '', 518 width: 300, 519 zIndex: 1000 520 }, 521 522 getter: 'isOpen', 523 524 uuid: 0, 525 maxZ: 0, 526 527 getTitleId: function($el) { 528 return 'ui-dialog-title-' + ($el.attr('id') || ++this.uuid); 529 }, 530 531 overlay: function(dialog) { 532 this.$el = $.ui.dialog.overlay.create(dialog); 533 } 534 }); 535 536 $.extend($.ui.dialog.overlay, { 537 instances: [], 538 maxZ: 0, 539 events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), 540 function(event) { return event + '.dialog-overlay'; }).join(' '), 541 create: function(dialog) { 542 if (this.instances.length === 0) { 543 // prevent use of anchors and inputs 544 // we use a setTimeout in case the overlay is created from an 545 // event that we're going to be cancelling (see #2804) 546 setTimeout(function() { 547 // handle $(el).dialog().dialog('close') (see #4065) 548 if ($.ui.dialog.overlay.instances.length) { 549 $(document).bind($.ui.dialog.overlay.events, function(event) { 550 var dialogZ = $(event.target).parents('.ui-dialog').css('zIndex') || 0; 551 return (dialogZ > $.ui.dialog.overlay.maxZ); 552 }); 553 } 554 }, 1); 555 556 // allow closing by pressing the escape key 557 $(document).bind('keydown.dialog-overlay', function(event) { 558 (dialog.options.closeOnEscape && event.keyCode 559 && event.keyCode == $.ui.keyCode.ESCAPE && dialog.close(event)); 560 }); 561 562 // handle window resize 563 $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); 564 } 565 566 var $el = $('<div></div>').appendTo(document.body) 567 .addClass('ui-widget-overlay').css({ 568 width: this.width(), 569 height: this.height() 570 }); 571 572 (dialog.options.bgiframe && $.fn.bgiframe && $el.bgiframe()); 573 574 this.instances.push($el); 575 return $el; 576 }, 577 578 destroy: function($el) { 579 this.instances.splice($.inArray(this.instances, $el), 1); 580 581 if (this.instances.length === 0) { 582 $([document, window]).unbind('.dialog-overlay'); 583 } 584 585 $el.remove(); 586 587 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) 588 var maxZ = 0; 589 $.each(this.instances, function() { 590 maxZ = Math.max(maxZ, this.css('z-index')); 591 }); 592 this.maxZ = maxZ; 593 }, 594 595 height: function() { 596 // handle IE 6 597 if ($.browser.msie && $.browser.version < 7) { 598 var scrollHeight = Math.max( 599 document.documentElement.scrollHeight, 600 document.body.scrollHeight 601 ); 602 var offsetHeight = Math.max( 603 document.documentElement.offsetHeight, 604 document.body.offsetHeight 605 ); 606 607 if (scrollHeight < offsetHeight) { 608 return $(window).height() + 'px'; 609 } else { 610 return scrollHeight + 'px'; 611 } 612 // handle "good" browsers 613 } else { 614 return $(document).height() + 'px'; 615 } 616 }, 617 618 width: function() { 619 // handle IE 6 620 if ($.browser.msie && $.browser.version < 7) { 621 var scrollWidth = Math.max( 622 document.documentElement.scrollWidth, 623 document.body.scrollWidth 624 ); 625 var offsetWidth = Math.max( 626 document.documentElement.offsetWidth, 627 document.body.offsetWidth 628 ); 629 630 if (scrollWidth < offsetWidth) { 631 return $(window).width() + 'px'; 632 } else { 633 return scrollWidth + 'px'; 634 } 635 // handle "good" browsers 636 } else { 637 return $(document).width() + 'px'; 638 } 639 }, 640 641 resize: function() { 642 /* If the dialog is draggable and the user drags it past the 643 * right edge of the window, the document becomes wider so we 644 * need to stretch the overlay. If the user then drags the 645 * dialog back to the left, the document will become narrower, 646 * so we need to shrink the overlay to the appropriate size. 647 * This is handled by shrinking the overlay before setting it 648 * to the full document size. 649 */ 650 var $overlays = $([]); 651 $.each($.ui.dialog.overlay.instances, function() { 652 $overlays = $overlays.add(this); 653 }); 654 655 $overlays.css({ 656 width: 0, 657 height: 0 658 }).css({ 659 width: $.ui.dialog.overlay.width(), 660 height: $.ui.dialog.overlay.height() 661 }); 662 } 663 }); 664 665 $.extend($.ui.dialog.overlay.prototype, { 666 destroy: function() { 667 $.ui.dialog.overlay.destroy(this.$el); 668 } 669 }); 670 671 })(jQuery);
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Jul 9 18:01:44 2012 | Cross-referenced by PHPXref 0.7 |