summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/mobile/Overlay.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/mobile/Overlay.js')
-rw-r--r--js/dojo/dojox/mobile/Overlay.js96
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()
+ }
+ });
+});