define([ "dojo/_base/declare", // declare "dojo/_base/lang", // lang.hitch "dojo/aspect", // aspect.after "dojo/dom-attr", // domAttr.set "dojo/dom-style", // domStyle.getComputedStyle "dojo/on", "dojo/window", // winUtils.getBox, winUtils.get "./_Widget", "./_TemplatedMixin", "./BackgroundIframe", "./Viewport", "./main" // for back-compat, exporting dijit._underlay (remove in 2.0) ], function(declare, lang, aspect, domAttr, domStyle, on, winUtils, _Widget, _TemplatedMixin, BackgroundIframe, Viewport, dijit){ // module: // dijit/DialogUnderlay var DialogUnderlay = declare("dijit.DialogUnderlay", [_Widget, _TemplatedMixin], { // summary: // A component used to block input behind a `dijit/Dialog`. // // Normally this class should not be instantiated directly, but rather shown and hidden via // DialogUnderlay.show() and DialogUnderlay.hide(). And usually the module is not accessed directly // at all, since the underlay is shown and hidden by Dialog.DialogLevelManager. // // The underlay itself can be styled based on and id: // | #myDialog_underlay { background-color:red; } // // In the case of `dijit.Dialog`, this id is based on the id of the Dialog, // suffixed with _underlay. // Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe. // Inner div has opacity specified in CSS file. templateString: "
", // Parameters on creation or updatable later // dialogId: String // Id of the dialog.... DialogUnderlay's id is based on this id dialogId: "", // class: String // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay "class": "", // This will get overwritten as soon as show() is call, but leave an empty array in case hide() or destroy() // is called first. The array is shared between instances but that's OK because we never write into it. _modalConnects: [], _setDialogIdAttr: function(id){ domAttr.set(this.node, "id", id + "_underlay"); this._set("dialogId", id); }, _setClassAttr: function(clazz){ this.node.className = "dijitDialogUnderlay " + clazz; this._set("class", clazz); }, postCreate: function(){ // Append the underlay to the body this.ownerDocumentBody.appendChild(this.domNode); this.own(on(this.domNode, "keydown", lang.hitch(this, "_onKeyDown"))); this.inherited(arguments); }, layout: function(){ // summary: // Sets the background to the size of the viewport // // description: // Sets the background to the size of the viewport (rather than the size // of the document) since we need to cover the whole browser window, even // if the document is only a few lines long. // tags: // private var is = this.node.style, os = this.domNode.style; // hide the background temporarily, so that the background itself isn't // causing scrollbars to appear (might happen when user shrinks browser // window and then we are called to resize) os.display = "none"; // then resize and show var viewport = winUtils.getBox(this.ownerDocument); os.top = viewport.t + "px"; os.left = viewport.l + "px"; is.width = viewport.w + "px"; is.height = viewport.h + "px"; os.display = "block"; }, show: function(){ // summary: // Show the dialog underlay this.domNode.style.display = "block"; this.open = true; this.layout(); this.bgIframe = new BackgroundIframe(this.domNode); var win = winUtils.get(this.ownerDocument); this._modalConnects = [ Viewport.on("resize", lang.hitch(this, "layout")), on(win, "scroll", lang.hitch(this, "layout")) ]; }, hide: function(){ // summary: // Hides the dialog underlay this.bgIframe.destroy(); delete this.bgIframe; this.domNode.style.display = "none"; while(this._modalConnects.length){ (this._modalConnects.pop()).remove(); } this.open = false; }, destroy: function(){ while(this._modalConnects.length){ (this._modalConnects.pop()).remove(); } this.inherited(arguments); }, _onKeyDown: function(){ // summary: // Extension point so Dialog can monitor keyboard events on the underlay. } }); DialogUnderlay.show = function(/*Object*/ attrs, /*Number*/ zIndex){ // summary: // Display the underlay with the given attributes set. If the underlay is already displayed, // then adjust it's attributes as specified. // attrs: // The parameters to create DialogUnderlay with. // zIndex: // zIndex of the underlay var underlay = DialogUnderlay._singleton; if(!underlay || underlay._destroyed){ underlay = dijit._underlay = DialogUnderlay._singleton = new DialogUnderlay(attrs); }else{ if(attrs){ underlay.set(attrs); } } domStyle.set(underlay.domNode, 'zIndex', zIndex); if(!underlay.open){ underlay.show(); } }; DialogUnderlay.hide = function(){ // summary: // Hide the underlay. // Guard code in case the underlay widget has already been destroyed // because we are being called during page unload (when all widgets are destroyed) var underlay = DialogUnderlay._singleton; if(underlay && !underlay._destroyed){ underlay.hide(); } }; return DialogUnderlay; });