1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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()
- }
- });
- });
|