Rev 1372 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.Dialog");dojo.require("dojo.widget.*");dojo.require("dojo.widget.ContentPane");dojo.require("dojo.event.*");dojo.require("dojo.gfx.color");dojo.require("dojo.html.layout");dojo.require("dojo.html.display");dojo.require("dojo.html.iframe");dojo.declare("dojo.widget.ModalDialogBase", null, {isContainer:true, focusElement:"", bgColor:"black", bgOpacity:0.4, followScroll:true, closeOnBackgroundClick:false, trapTabs:function (e) {if (e.target == this.tabStartOuter) {if (this._fromTrap) {this.tabStart.focus();this._fromTrap = false;} else {this._fromTrap = true;this.tabEnd.focus();}} else {if (e.target == this.tabStart) {if (this._fromTrap) {this._fromTrap = false;} else {this._fromTrap = true;this.tabEnd.focus();}} else {if (e.target == this.tabEndOuter) {if (this._fromTrap) {this.tabEnd.focus();this._fromTrap = false;} else {this._fromTrap = true;this.tabStart.focus();}} else {if (e.target == this.tabEnd) {if (this._fromTrap) {this._fromTrap = false;} else {this._fromTrap = true;this.tabStart.focus();}}}}}}, clearTrap:function (e) {var _this = this;setTimeout(function () {_this._fromTrap = false;}, 100);}, postCreate:function () {with (this.domNode.style) {position = "absolute";zIndex = 999;display = "none";overflow = "visible";}var b = dojo.body();b.appendChild(this.domNode);this.bg = document.createElement("div");this.bg.className = "dialogUnderlay";with (this.bg.style) {position = "absolute";left = top = "0px";zIndex = 998;display = "none";}b.appendChild(this.bg);this.setBackgroundColor(this.bgColor);this.bgIframe = new dojo.html.BackgroundIframe();if (this.bgIframe.iframe) {with (this.bgIframe.iframe.style) {position = "absolute";left = top = "0px";zIndex = 90;display = "none";}}if (this.closeOnBackgroundClick) {dojo.event.kwConnect({srcObj:this.bg, srcFunc:"onclick", adviceObj:this, adviceFunc:"onBackgroundClick", once:true});}}, uninitialize:function () {this.bgIframe.remove();dojo.html.removeNode(this.bg, true);}, setBackgroundColor:function (color) {if (arguments.length >= 3) {color = new dojo.gfx.color.Color(arguments[0], arguments[1], arguments[2]);} else {color = new dojo.gfx.color.Color(color);}this.bg.style.backgroundColor = color.toString();return this.bgColor = color;}, setBackgroundOpacity:function (op) {if (arguments.length == 0) {op = this.bgOpacity;}dojo.html.setOpacity(this.bg, op);try {this.bgOpacity = dojo.html.getOpacity(this.bg);}catch (e) {this.bgOpacity = op;}return this.bgOpacity;}, _sizeBackground:function () {if (this.bgOpacity > 0) {var viewport = dojo.html.getViewport();var h = viewport.height;var w = viewport.width;with (this.bg.style) {width = w + "px";height = h + "px";}var scroll_offset = dojo.html.getScroll().offset;this.bg.style.top = scroll_offset.y + "px";this.bg.style.left = scroll_offset.x + "px";var viewport = dojo.html.getViewport();if (viewport.width != w) {this.bg.style.width = viewport.width + "px";}if (viewport.height != h) {this.bg.style.height = viewport.height + "px";}}this.bgIframe.size(this.bg);}, _showBackground:function () {if (this.bgOpacity > 0) {this.bg.style.display = "block";}if (this.bgIframe.iframe) {this.bgIframe.iframe.style.display = "block";}}, placeModalDialog:function () {var scroll_offset = dojo.html.getScroll().offset;var viewport_size = dojo.html.getViewport();var mb;if (this.isShowing()) {mb = dojo.html.getMarginBox(this.domNode);} else {dojo.html.setVisibility(this.domNode, false);dojo.html.show(this.domNode);mb = dojo.html.getMarginBox(this.domNode);dojo.html.hide(this.domNode);dojo.html.setVisibility(this.domNode, true);}var x = scroll_offset.x + (viewport_size.width - mb.width) / 2;var y = scroll_offset.y + (viewport_size.height - mb.height) / 2;with (this.domNode.style) {left = x + "px";top = y + "px";}}, _onKey:function (evt) {if (evt.key) {var node = evt.target;while (node != null) {if (node == this.domNode) {return;}node = node.parentNode;}if (evt.key != evt.KEY_TAB) {dojo.event.browser.stopEvent(evt);} else {if (!dojo.render.html.opera) {try {this.tabStart.focus();}catch (e) {}}}}}, showModalDialog:function () {if (this.followScroll && !this._scrollConnected) {this._scrollConnected = true;dojo.event.connect(window, "onscroll", this, "_onScroll");}dojo.event.connect(document.documentElement, "onkey", this, "_onKey");this.placeModalDialog();this.setBackgroundOpacity();this._sizeBackground();this._showBackground();this._fromTrap = true;setTimeout(dojo.lang.hitch(this, function () {try {this.tabStart.focus();}catch (e) {}}), 50);}, hideModalDialog:function () {if (this.focusElement) {dojo.byId(this.focusElement).focus();dojo.byId(this.focusElement).blur();}this.bg.style.display = "none";this.bg.style.width = this.bg.style.height = "1px";if (this.bgIframe.iframe) {this.bgIframe.iframe.style.display = "none";}dojo.event.disconnect(document.documentElement, "onkey", this, "_onKey");if (this._scrollConnected) {this._scrollConnected = false;dojo.event.disconnect(window, "onscroll", this, "_onScroll");}}, _onScroll:function () {var scroll_offset = dojo.html.getScroll().offset;this.bg.style.top = scroll_offset.y + "px";this.bg.style.left = scroll_offset.x + "px";this.placeModalDialog();}, checkSize:function () {if (this.isShowing()) {this._sizeBackground();this.placeModalDialog();this.onResized();}}, onBackgroundClick:function () {if (this.lifetime - this.timeRemaining >= this.blockDuration) {return;}this.hide();}});dojo.widget.defineWidget("dojo.widget.Dialog", [dojo.widget.ContentPane, dojo.widget.ModalDialogBase], {templateString:"<div id=\"${this.widgetId}\" class=\"dojoDialog\" dojoattachpoint=\"wrapper\">\n\t<span dojoattachpoint=\"tabStartOuter\" dojoonfocus=\"trapTabs\" dojoonblur=\"clearTrap\"\ttabindex=\"0\"></span>\n\t<span dojoattachpoint=\"tabStart\" dojoonfocus=\"trapTabs\" dojoonblur=\"clearTrap\" tabindex=\"0\"></span>\n\t<div dojoattachpoint=\"containerNode\" style=\"position: relative; z-index: 2;\"></div>\n\t<span dojoattachpoint=\"tabEnd\" dojoonfocus=\"trapTabs\" dojoonblur=\"clearTrap\" tabindex=\"0\"></span>\n\t<span dojoattachpoint=\"tabEndOuter\" dojoonfocus=\"trapTabs\" dojoonblur=\"clearTrap\" tabindex=\"0\"></span>\n</div>\n", blockDuration:0, lifetime:0, closeNode:"", postMixInProperties:function () {dojo.widget.Dialog.superclass.postMixInProperties.apply(this, arguments);if (this.closeNode) {this.setCloseControl(this.closeNode);}}, postCreate:function () {dojo.widget.Dialog.superclass.postCreate.apply(this, arguments);dojo.widget.ModalDialogBase.prototype.postCreate.apply(this, arguments);}, show:function () {if (this.lifetime) {this.timeRemaining = this.lifetime;if (this.timerNode) {this.timerNode.innerHTML = Math.ceil(this.timeRemaining / 1000);}if (this.blockDuration && this.closeNode) {if (this.lifetime > this.blockDuration) {this.closeNode.style.visibility = "hidden";} else {this.closeNode.style.display = "none";}}if (this.timer) {clearInterval(this.timer);}this.timer = setInterval(dojo.lang.hitch(this, "_onTick"), 100);}this.showModalDialog();dojo.widget.Dialog.superclass.show.call(this);}, onLoad:function () {this.placeModalDialog();dojo.widget.Dialog.superclass.onLoad.call(this);}, fillInTemplate:function () {}, hide:function () {this.hideModalDialog();dojo.widget.Dialog.superclass.hide.call(this);if (this.timer) {clearInterval(this.timer);}}, setTimerNode:function (node) {this.timerNode = node;}, setCloseControl:function (node) {this.closeNode = dojo.byId(node);dojo.event.connect(this.closeNode, "onclick", this, "hide");}, setShowControl:function (node) {node = dojo.byId(node);dojo.event.connect(node, "onclick", this, "show");}, _onTick:function () {if (this.timer) {this.timeRemaining -= 100;if (this.lifetime - this.timeRemaining >= this.blockDuration) {if (this.closeNode) {this.closeNode.style.visibility = "visible";}}if (!this.timeRemaining) {clearInterval(this.timer);this.hide();} else {if (this.timerNode) {this.timerNode.innerHTML = Math.ceil(this.timeRemaining / 1000);}}}}});