97 lines
3.2 KiB
JavaScript
97 lines
3.2 KiB
JavaScript
//>>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()
|
|
}
|
|
});
|
|
});
|