diff options
Diffstat (limited to 'js/dojo/dojox/mobile/Overlay.js')
| -rw-r--r-- | js/dojo/dojox/mobile/Overlay.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/js/dojo/dojox/mobile/Overlay.js b/js/dojo/dojox/mobile/Overlay.js new file mode 100644 index 0000000..625eb7b --- /dev/null +++ b/js/dojo/dojox/mobile/Overlay.js @@ -0,0 +1,96 @@ +//>>built +define("dojox/mobile/Overlay", [ + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/sniff", + "dojo/_base/window", + "dojo/dom-class", + "dojo/dom-geometry", + "dojo/dom-style", + "dojo/window", + "dijit/_WidgetBase", + "dojo/_base/array", + "dijit/registry" +], function(declare, lang, has, win, domClass, domGeometry, domStyle, windowUtils, WidgetBase, array, registry){ + + /*===== + WidgetBase = dijit._WidgetBase; + =====*/ + return declare("dojox.mobile.Overlay", WidgetBase, { + // summary: + // A non-templated widget that animates up from the bottom, overlaying the current content + // + + baseClass: "mblOverlay mblOverlayHidden", + + show: function(/*DomNode?*/aroundNode){ + // summary: + // Scroll the overlay up into view + array.forEach(registry.findWidgets(this.domNode), function(w){ + if(w && w.height == "auto" && typeof w.resize == "function"){ + w.resize(); + } + }); + var vp, popupPos; + var reposition = lang.hitch(this, function(){ + domStyle.set(this.domNode, { position: "", top: "auto", bottom: "0px" }); + popupPos = domGeometry.position(this.domNode); + vp = windowUtils.getBox(); + if((popupPos.y+popupPos.h) != vp.h // TODO: should be a has() test for position:fixed not scrolling + || has("android") < 3){ // android 2.x supports position:fixed but child transforms don't persist + popupPos.y = vp.t + vp.h - popupPos.h; + domStyle.set(this.domNode, { position: "absolute", top: popupPos.y + "px", bottom: "auto" }); + } + }); + reposition(); + if(aroundNode){ + var aroundPos = domGeometry.position(aroundNode); + if(popupPos.y < aroundPos.y){ // if the aroundNode is under the popup, try to scroll it up + win.global.scrollBy(0, aroundPos.y + aroundPos.h - popupPos.y); + reposition(); + } + } + domClass.replace(this.domNode, ["mblCoverv", "mblIn"], ["mblOverlayHidden", "mblRevealv", "mblOut", "mblReverse"]); + var _domNode = this.domNode; + setTimeout(function(){ + domClass.add(_domNode, "mblTransition"); + }, 100); + var timeoutHandler = null; + this._moveHandle = this.connect(win.doc.documentElement, "ontouchmove", function(){ + if(timeoutHandler){ + clearTimeout(timeoutHandler); + } + timeoutHandler = setTimeout(function(){ + reposition(); + timeoutHandler = null; + }, 0); + }); + }, + + hide: function(){ + // summary: + // Scroll the overlay down and then make it invisible + if(this._moveHandle){ + this.disconnect(this._moveHandle); + this._moveHandle = null; + } + if(has("webkit")){ + var handler = this.connect(this.domNode, "webkitTransitionEnd", function(){ + this.disconnect(handler); + domClass.replace(this.domNode, ["mblOverlayHidden"], ["mblRevealv", "mblOut", "mblReverse", "mblTransition"]); + }); + domClass.replace(this.domNode, ["mblRevealv", "mblOut", "mblReverse"], ["mblCoverv", "mblIn", "mblTransition"]); + var _domNode = this.domNode; + setTimeout(function(){ + domClass.add(_domNode, "mblTransition"); + }, 100); + }else{ + domClass.replace(this.domNode, ["mblOverlayHidden"], ["mblCoverv", "mblIn", "mblRevealv", "mblOut", "mblReverse"]); + } + }, + + onBlur: function(/*Event*/e){ + return false; // touching outside the overlay area does not call hide() + } + }); +}); |
