1 | define([ |
---|
2 | "dojo/_base/declare", |
---|
3 | "dojo/_base/Deferred", |
---|
4 | "dojo/_base/lang", |
---|
5 | "dojo/_base/window", |
---|
6 | "dojo/dom-class", |
---|
7 | "dojo/dom-construct", |
---|
8 | "dojo/dom-style", |
---|
9 | "dojo/dom-geometry", |
---|
10 | "./Tooltip", |
---|
11 | "./Overlay", |
---|
12 | "./lazyLoadUtils" |
---|
13 | ], function(declare, Deferred, lang, win, domClass, domConstruct, domStyle, domGeometry, Tooltip, Overlay, lazyLoadUtils){ |
---|
14 | |
---|
15 | var isOverlay = domClass.contains(win.doc.documentElement, "dj_phone"); |
---|
16 | |
---|
17 | var cls = declare("dojox.mobile.Opener", isOverlay ? Overlay : Tooltip, { |
---|
18 | // summary: |
---|
19 | // A non-templated popup widget that will use either Tooltip or |
---|
20 | // Overlay depending on screen size. |
---|
21 | |
---|
22 | // lazy: String |
---|
23 | // If true, the content of the widget, which includes dojo markup, |
---|
24 | // is instantiated lazily. That is, only when the widget is opened |
---|
25 | // by the user, the required modules are loaded and the content |
---|
26 | // widgets are instantiated. |
---|
27 | lazy: false, |
---|
28 | |
---|
29 | // requires: String |
---|
30 | // Comma-separated required module names to be lazily loaded. This |
---|
31 | // is effective only when lazy=true. All the modules specified with |
---|
32 | // dojoType and their depending modules are automatically loaded |
---|
33 | // when the widget is opened. However, if you need other extra |
---|
34 | // modules to be loaded, use this parameter. |
---|
35 | requires: "", |
---|
36 | |
---|
37 | buildRendering: function(){ |
---|
38 | this.inherited(arguments); |
---|
39 | this.cover = domConstruct.create('div', { |
---|
40 | onclick: lang.hitch(this, '_onBlur'), 'class': 'mblOpenerUnderlay', |
---|
41 | style: { position: isOverlay ? 'absolute' : 'fixed', backgroundColor:'transparent', overflow:'hidden', zIndex:'-1' } |
---|
42 | }, this.domNode, 'first'); |
---|
43 | }, |
---|
44 | |
---|
45 | onShow: function(/*DomNode*/node){}, |
---|
46 | onHide: function(/*DomNode*/node, /*Anything*/v){}, |
---|
47 | |
---|
48 | show: function(node, positions){ |
---|
49 | if(this.lazy){ |
---|
50 | this.lazy = false; |
---|
51 | var _this = this; |
---|
52 | return Deferred.when(lazyLoadUtils.instantiateLazyWidgets(this.domNode, this.requires), function(){ |
---|
53 | return _this.show(node, positions); |
---|
54 | }); |
---|
55 | } |
---|
56 | this.node = node; |
---|
57 | this.onShow(node); |
---|
58 | domStyle.set(this.cover, { top:'0px', left:'0px', width:'0px', height:'0px' }); // move cover temporarily to calculate domNode vertical position correctly |
---|
59 | this._resizeCover(domGeometry.position(this.domNode, false)); // must be before this.inherited(arguments) for Tooltip sizing |
---|
60 | return this.inherited(arguments); |
---|
61 | }, |
---|
62 | |
---|
63 | hide: function(/*Anything*/ val){ |
---|
64 | this.inherited(arguments); |
---|
65 | this.onHide(this.node, val); |
---|
66 | }, |
---|
67 | |
---|
68 | _reposition: function(){ |
---|
69 | // tags: |
---|
70 | // private |
---|
71 | var popupPos = this.inherited(arguments); |
---|
72 | this._resizeCover(popupPos); |
---|
73 | return popupPos; |
---|
74 | }, |
---|
75 | |
---|
76 | _resizeCover: function(popupPos){ |
---|
77 | // tags: |
---|
78 | // private |
---|
79 | if(isOverlay){ |
---|
80 | if(parseInt(domStyle.get(this.cover, 'top')) != -popupPos.y || parseInt(domStyle.get(this.cover, 'height')) != popupPos.y){ |
---|
81 | var x = Math.max(popupPos.x, 0); // correct onorientationchange values |
---|
82 | domStyle.set(this.cover, { top:-popupPos.y+'px', left:-x+'px', width:popupPos.w+x+'px', height:popupPos.y+'px' }); |
---|
83 | } |
---|
84 | }else{ |
---|
85 | domStyle.set(this.cover, { |
---|
86 | width:Math.max(win.doc.documentElement.scrollWidth || win.body().scrollWidth || win.doc.documentElement.clientWidth)+'px', |
---|
87 | height:Math.max(win.doc.documentElement.scrollHeight || win.body().scrollHeight || win.doc.documentElement.clientHeight)+'px' |
---|
88 | }); |
---|
89 | } |
---|
90 | }, |
---|
91 | |
---|
92 | _onBlur: function(e){ |
---|
93 | // tags: |
---|
94 | // private |
---|
95 | var ret = this.onBlur(e); |
---|
96 | if(ret !== false){ // only exactly false prevents hide() |
---|
97 | this.hide(e); |
---|
98 | } |
---|
99 | return ret; |
---|
100 | } |
---|
101 | }); |
---|
102 | cls.prototype.baseClass += " mblOpener"; // add to either mblOverlay or mblTooltip |
---|
103 | return cls; |
---|
104 | }); |
---|