[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/jquery_ui/jquery.ui/ui/ -> ui.dialog.js (source)

   1  /*

   2   * jQuery UI Dialog 1.7.2

   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 || '&nbsp;');
 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.2",
 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);


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7