summaryrefslogtreecommitdiff
path: root/js/dojo-1.6/dojox/mobile/ScrollableView.js
blob: cb215dcd5c4cdf0fd1a3a0389fb8fb3b30dd3885 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
	Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.mobile.ScrollableView"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.mobile.ScrollableView"] = true;
dojo.provide("dojox.mobile.ScrollableView");

dojo.require("dijit._WidgetBase");
dojo.require("dojox.mobile");
dojo.require("dojox.mobile._ScrollableMixin");

// summary:
//		A container that has a touch scrolling capability.
// description:
//		ScrollableView is a subclass of View (=dojox.mobile.View).
//		Unlike the base View class, ScrollableView's domNode always stays
//		at the top of the screen and its height is "100%" of the screen.
//		In this fixed domNode, containerNode scrolls. Browser's default
//		scrolling behavior is disabled, and the scrolling machinery is
//		re-implemented with JavaScript. Thus the user does not need to use the
//		two-finger operation to scroll an inner DIV (containerNode).
//		The main purpose of this widget is to realize fixed-positioned header
//		and/or footer bars.

dojo.declare(
	"dojox.mobile.ScrollableView",
	[dojox.mobile.View, dojox.mobile._ScrollableMixin],
{
	flippable: false,

	buildRendering: function(){
		this.inherited(arguments);
		dojo.addClass(this.domNode, "mblScrollableView");
		this.domNode.style.overflow = "hidden";
		this.domNode.style.top = "0px";
		this.domNode.style.height = "100%";
		this.containerNode = dojo.create("DIV",
			{className:"mblScrollableViewContainer"}, this.domNode);
		this.containerNode.style.position = "absolute";
		if(this.scrollDir === "v" || this.flippable){
			this.containerNode.style.width = "100%";
		}
		this.reparent();
		this.findAppBars();
	},

	addChild: function(widget){
		var c = widget.domNode;
		var fixed = this._checkFixedBar(c, true);
		if(fixed){
			this.domNode.appendChild(c);
			if(fixed === "top"){
				this.fixedHeaderHeight = c.offsetHeight;
				this.containerNode.style.paddingTop = this.fixedHeaderHeight + "px";
			}else if(fixed === "bottom"){
				this.fixedFooterHeight = c.offsetHeight;
				this.isLocalFooter = true;
				c.style.bottom = "0px";
			}
			this.resizeView();
		}else{
			this.containerNode.appendChild(c);
		}
	},

	reparent: function(){
		// move all the children, except header and footer, to containerNode.
		var i, idx, len, c;
		for(i = 0, idx = 0, len = this.domNode.childNodes.length; i < len; i++){
			c = this.domNode.childNodes[idx];
			// search for view-specific header or footer
			if(c === this.containerNode || this._checkFixedBar(c, true)){
				idx++;
				continue;
			}
			this.containerNode.appendChild(this.domNode.removeChild(c));
		}
	},

	findAppBars: function(){
		// search for application-specific header or footer
		var i, len, c;
		for(i = 0, len = dojo.body().childNodes.length; i < len; i++){
			c = dojo.body().childNodes[i];
			this._checkFixedBar(c, false);
		}
		if(this.domNode.parentNode){
			for(i = 0, len = this.domNode.parentNode.childNodes.length; i < len; i++){
				c = this.domNode.parentNode.childNodes[i];
				this._checkFixedBar(c, false);
			}
		}
		this.fixedHeaderHeight = this.fixedHeader ? this.fixedHeader.offsetHeight : 0;
		this.fixedFooterHeight = this.fixedFooter ? this.fixedFooter.offsetHeight : 0;
	},

	_checkFixedBar: function(/*DomNode*/node){
		if(node.nodeType === 1){
			var fixed = node.getAttribute("fixed")
				|| (dijit.byNode(node) && dijit.byNode(node).fixed);
			if(fixed){
				dojo.style(node, {
					position: "absolute",
					width: "100%",
					zIndex: 1
				});
			}
			if(fixed === "top"){
				node.style.top = "0px";
				this.fixedHeader = node;
				return fixed;
			}else if(fixed === "bottom"){
				this.fixedFooter = node;
				return fixed;
			}
		}
		return null;
	},

	onAfterTransitionIn: function(moveTo, dir, transition, context, method){
		this.flashScrollBar();
	}
});

}