text: define("dojox/mobile/Opener", [
  	"dojo/_base/declare",
  	"dojo/_base/Deferred",
  	"dojo/_base/lang",
  	"dojo/_base/window",
  	"dojo/dom-class",
  	"dojo/dom-construct",
  	"dojo/dom-style",
  	"dojo/dom-geometry",
  	"./Tooltip",
  	"./Overlay",
  	"./lazyLoadUtils"
  ], function(declare, Deferred, lang, win, domClass, domConstruct, domStyle, domGeometry, Tooltip, Overlay, lazyLoadUtils){
  
  	var isOverlay = domClass.contains(win.doc.documentElement, "dj_phone");
  	
  	var cls = declare("dojox.mobile.Opener", isOverlay ? Overlay : Tooltip, {
  		// summary:
  		//		A non-templated popup widget that will use either Tooltip or 
  		//		Overlay depending on screen size.
  
  		// lazy: String
  		//		If true, the content of the widget, which includes dojo markup,
  		//		is instantiated lazily. That is, only when the widget is opened
  		//		by the user, the required modules are loaded and the content
  		//		widgets are instantiated.
  		lazy: false,
  
  		// requires: String
  		//		Comma-separated required module names to be lazily loaded. This
  		//		is effective only when lazy=true. All the modules specified with
  		//		dojoType and their depending modules are automatically loaded
  		//		when the widget is opened. However, if you need other extra
  		//		modules to be loaded, use this parameter.
  		requires: "",
  
  		buildRendering: function(){
  			this.inherited(arguments);
  			this.cover = domConstruct.create('div', {
  				onclick: lang.hitch(this, '_onBlur'), 'class': 'mblOpenerUnderlay',
  				style: { position: isOverlay ? 'absolute' : 'fixed', backgroundColor:'transparent', overflow:'hidden', zIndex:'-1' }
  			}, this.domNode, 'first');
  		},
  
  		onShow: function(/*DomNode*/node){},
  		onHide: function(/*DomNode*/node, /*Anything*/v){},
  
  		show: function(node, positions){
  			if(this.lazy){
  				this.lazy = false;
  				var _this = this;
  				return Deferred.when(lazyLoadUtils.instantiateLazyWidgets(this.domNode, this.requires), function(){
  					return _this.show(node, positions);
  				});
  			}
  			this.node = node;
  			this.onShow(node);
  			domStyle.set(this.cover, { top:'0px', left:'0px', width:'0px', height:'0px' }); // move cover temporarily to calculate domNode vertical position correctly
  			this._resizeCover(domGeometry.position(this.domNode, false)); // must be before this.inherited(arguments) for Tooltip sizing
  			return this.inherited(arguments);
  		},
  
  		hide: function(/*Anything*/ val){
  			this.inherited(arguments);
  			this.onHide(this.node, val);
  		},
  		
  		_reposition: function(){
  			// tags:
  			//		private
  			var popupPos = this.inherited(arguments);
  			this._resizeCover(popupPos);
  			return popupPos;
  		},
  
  		_resizeCover: function(popupPos){
  			// tags:
  			//		private
  			if(isOverlay){
  				if(parseInt(domStyle.get(this.cover, 'top')) != -popupPos.y || parseInt(domStyle.get(this.cover, 'height')) != popupPos.y){
  					var x = Math.max(popupPos.x, 0); // correct onorientationchange values
  					domStyle.set(this.cover, { top:-popupPos.y+'px', left:-x+'px', width:popupPos.w+x+'px', height:popupPos.y+'px' });
  				}
  			}else{
  				domStyle.set(this.cover, { 
  					width:Math.max(win.doc.documentElement.scrollWidth || win.body().scrollWidth || win.doc.documentElement.clientWidth)+'px', 
  					height:Math.max(win.doc.documentElement.scrollHeight || win.body().scrollHeight || win.doc.documentElement.clientHeight)+'px' 
  				});
  			}			
  		},
  
  		_onBlur: function(e){
  			// tags:
  			//		private
  			var ret = this.onBlur(e);
  			if(ret !== false){ // only exactly false prevents hide()
  				this.hide(e);
  			}
  			return ret;
  		}
  	});
  	cls.prototype.baseClass += " mblOpener"; // add to either mblOverlay or mblTooltip
  	return cls;
  });
  