diff options
Diffstat (limited to 'js/dojo/dojox/widget/Dialog.js')
| -rw-r--r-- | js/dojo/dojox/widget/Dialog.js | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/js/dojo/dojox/widget/Dialog.js b/js/dojo/dojox/widget/Dialog.js new file mode 100644 index 0000000..0ca4bc5 --- /dev/null +++ b/js/dojo/dojox/widget/Dialog.js @@ -0,0 +1,253 @@ +//>>built +require({cache:{ +'url:dojox/widget/Dialog/Dialog.html':"<div class=\"dojoxDialog\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dojoxDialogTitleBar\">\n\t\t<span dojoAttachPoint=\"titleNode\" class=\"dojoxDialogTitle\" id=\"${id}_title\">${title}</span>\n\t</div>\n\t<div dojoAttachPoint=\"dojoxDialogWrapper\">\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dojoxDialogPaneContent\"></div>\n\t</div>\n\t<div dojoAttachPoint=\"closeButtonNode\" class=\"dojoxDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</div>\n</div>\n"}}); +define("dojox/widget/Dialog", [ + "dojo", "dojox", "dojo/text!./Dialog/Dialog.html", + "dijit/Dialog", "dojo/window", "dojox/fx", "./DialogSimple" +], function(dojo, dojox, template){ + + dojo.getObject('widget', true, dojox); + + dojo.declare('dojox.widget.Dialog', dojox.widget.DialogSimple, + { + // summary: + // A Lightbox-like Modal-dialog for HTML Content + // + // description: + // An HTML-capable Dialog widget with advanced sizing + // options, animated show/hide and other useful options. + // + // This Dialog is also very easy to apply custom styles to. + // + // It works identically to a `dijit.Dialog` with several + // additional parameters. + + templateString: template, + + // sizeToViewport: Boolean + // If true, fix the size of the dialog to the Viewport based on + // viewportPadding value rather than the calculated or natural + // stlye. If false, base the size on a passed dimension attribute. + // Eitherway, the viewportPadding value is used if the the content + // extends beyond the viewport size for whatever reason. + sizeToViewport: false, + + // viewportPadding: Integer + // If sizeToViewport="true", this is the amount of padding in pixels to leave + // between the dialog border and the viewport edge. + // This value is also used when sizeToViewport="false" and dimensions exceeded + // by dialog content to ensure dialog does not go outside viewport boundary + viewportPadding: 35, + + // dimensions: Array + // A two-element array of [widht,height] to animate the Dialog to if sizeToViewport="false" + // Defaults to [300,300] + dimensions: null, + + // easing: Function?|String? + // An easing function to apply to the sizing animation. + easing: null, + + // sizeDuration: Integer + // Time (in ms) to use in the Animation for sizing. + sizeDuration: dijit._defaultDuration, + + // sizeMethod: String + // To be passed to dojox.fx.sizeTo, one of "chain" or "combine" to effect + // the animation sequence. + sizeMethod: "chain", + + // showTitle: Boolean + // Toogle to show or hide the Title area. Can only be set at startup. + showTitle: false, + + // draggable: Boolean + // Make the pane draggable. Differs from dijit.Dialog by setting default to false + draggable: false, // simply over-ride the default from dijit.Dialog + + // modal: Boolean + // If true, this Dialog instance will be truly modal and prevent closing until + // explicitly told to by calling hide() - Defaults to false to preserve previous + // behaviors. + modal: false, + + constructor: function(props, node){ + this.easing = props.easing || dojo._defaultEasing; + this.dimensions = props.dimensions || [300, 300]; + }, + + _setup: function(){ + // summary: Piggyback on dijit.Dialog's _setup for load-time options, deferred to + + this.inherited(arguments); + if(!this._alreadyInitialized){ + this._navIn = dojo.fadeIn({ node: this.closeButtonNode }); + this._navOut = dojo.fadeOut({ node: this.closeButtonNode }); + if(!this.showTitle){ + dojo.addClass(this.domNode,"dojoxDialogNoTitle"); + } + } + }, + + layout: function(e){ + this._setSize(); + this.inherited(arguments); + }, + + _setSize: function(){ + // summary: cache and set our desired end position + this._vp = dojo.window.getBox(); + var tc = this.containerNode, + vpSized = this.sizeToViewport + ; + return this._displaysize = { + w: vpSized ? tc.scrollWidth : this.dimensions[0], + h: vpSized ? tc.scrollHeight : this.dimensions[1] + }; // Object + }, + + show: function(){ + if(this.open){ return; } + + this._setSize(); + dojo.style(this.closeButtonNode,"opacity", 0); + dojo.style(this.domNode, { + overflow: "hidden", + opacity: 0, + width: "1px", + height: "1px" + }); + dojo.style(this.containerNode, { + opacity: 0, + overflow: "hidden" + }); + + this.inherited(arguments); + + if(this.modal){ + // prevent escape key from closing dialog + // connect to body to trap this event from the Dialog a11y code, and stop escape key + // from doing anything in the modal:true case: + this._modalconnects.push(dojo.connect(dojo.body(), "onkeypress", function(e){ + if(e.charOrCode == dojo.keys.ESCAPE){ + dojo.stopEvent(e); + } + })); + }else{ + // otherwise, allow clicking on the underlay to close + this._modalconnects.push(dojo.connect(dijit._underlay.domNode, "onclick", this, "onCancel")); + } + this._modalconnects.push(dojo.connect(this.domNode,"onmouseenter",this,"_handleNav")); + this._modalconnects.push(dojo.connect(this.domNode,"onmouseleave",this,"_handleNav")); + + }, + + _handleNav: function(e){ + // summary: Handle's showing or hiding the close icon + + var navou = "_navOut", + navin = "_navIn", + animou = (e.type == "mouseout" ? navin : navou), + animin = (e.type == "mouseout" ? navou : navin) + ; + + this[animou].stop(); + this[animin].play(); + + }, + + // an experiment in a quicksilver-like hide. too choppy for me. + /* + hide: function(){ + // summary: Hide the dialog + + // if we haven't been initialized yet then we aren't showing and we can just return + if(!this._alreadyInitialized){ + return; + } + + this._fadeIn && this._fadeIn.stop(); + + if (this._scrollConnected){ + this._scrollConnected = false; + } + dojo.forEach(this._modalconnects, dojo.disconnect); + this._modalconnects = []; + if(this.refocus){ + this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus)); + } + if(this._relativePosition){ + delete this._relativePosition; + } + + dojox.fx.sizeTo({ + node: this.domNode, + duration:this.sizeDuration || this.duration, + width: this._vp.w - 1, + height: 5, + onBegin: dojo.hitch(this,function(){ + this._fadeOut.play(this.sizeDuration / 2); + }) + }).play(); + + this.open = false; + }, */ + + _position: function(){ + + if(!this._started){ return; } // prevent content: from firing this anim #8914 + + if(this._sizing){ + this._sizing.stop(); + this.disconnect(this._sizingConnect); + delete this._sizing; + } + + this.inherited(arguments); + + if(!this.open){ dojo.style(this.containerNode, "opacity", 0); } + var pad = this.viewportPadding * 2; + + var props = { + node: this.domNode, + duration: this.sizeDuration || dijit._defaultDuration, + easing: this.easing, + method: this.sizeMethod + }; + + var ds = this._displaysize || this._setSize(); + props['width'] = ds.w = (ds.w + pad >= this._vp.w || this.sizeToViewport) + ? this._vp.w - pad : ds.w; + + props['height'] = ds.h = (ds.h + pad >= this._vp.h || this.sizeToViewport) + ? this._vp.h - pad : ds.h; + + this._sizing = dojox.fx.sizeTo(props); + this._sizingConnect = this.connect(this._sizing,"onEnd","_showContent"); + this._sizing.play(); + + }, + + _showContent: function(e){ + // summary: Show the inner container after sizing animation + + var container = this.containerNode; + dojo.style(this.domNode, { + overflow: "visible", + opacity: 1 + }); + dojo.style(this.closeButtonNode,"opacity",1); + dojo.style(container, { + height: this._displaysize.h - this.titleNode.offsetHeight + "px", + width: this._displaysize.w + "px", + overflow:"auto" + }); + dojo.anim(container, { opacity:1 }); + } + + }); + + return dojox.widget.Dialog; + +}); + |
