OSDN Git Service

Version 0.6.8
[pettanr/clientJs.git] / 0.6.x / js / dom / 17_XView.js
1 X.View = {\r
2         Event : {\r
3                 SYS_READY         : 0,\r
4                 INIT              : 1,\r
5                 ADDED             : 2,\r
6                 CREATION_COMPLETE : 3,\r
7                 REMOVED           : 4,\r
8                 \r
9                 VIEW_RESIZED      : 5, // リサイズイベントのバブルアップは要素のレイアウトマネジャーでキャンセルされることも\r
10                 IN_VIEW           : 6, // 要素が視界に入った\r
11                 OUT_VIEW          : 7,\r
12                 \r
13                 POINTER_OUT       : 8,\r
14                 POINTER_IN        : 9,\r
15                 \r
16                 // FOCUS\r
17                 // DISABLED\r
18                 // ENABLED\r
19         \r
20         /* -- Pointing Device Event -- */\r
21                 _START_POINTER    : 10,\r
22                 \r
23                 CONTEXT_MENU      : 10, // rightclick or longtouch or menukey\r
24                 \r
25         /* -- ここよりあとははノード上をバブルアップ -- */\r
26                 _NO_BUBLEUP       : 10.5,               \r
27                 //\r
28                 POINTER_START     : 11,\r
29                 POINTER_END       : 12,\r
30                 POINTER_MOVE      : 13,\r
31                 \r
32                 SELECT            : 14, // click or tap or enterkey\r
33                 FILE_DRAG         : 15,\r
34                 \r
35         /* -- Pointing Device Event -- */\r
36                 _END_POINTER      : 15,\r
37                 \r
38                 KEY_DOWN          : 16,\r
39                 KEY_UP            : 17,\r
40                 \r
41                 SCROLL            : 18,\r
42         \r
43                 CHANGE            : 19,\r
44                 SUBMIT            : 20,\r
45                 \r
46                 IdToName : {},\r
47                 NameToID : {}\r
48         }\r
49 };\r
50 \r
51 if( window.navigator.msPointerEnabled ){\r
52         X.View.Event.IdToName[ X.View.Event.POINTER_START ] = 'MSPointerDown';\r
53         X.View.Event.IdToName[ X.View.Event.POINTER_END   ] = 'MSPointerUp';\r
54         X.View.Event.IdToName[ X.View.Event.POINTER_MOVE  ] = 'MSPointerMove';\r
55         X.View.Event.NameToID[ 'MSPointerDown' ] = X.View.Event.POINTER_START;\r
56         X.View.Event.NameToID[ 'MSPointerUp'   ] = X.View.Event.POINTER_END;\r
57         X.View.Event.NameToID[ 'MSPointerMove' ] = X.View.Event.POINTER_MOVE;\r
58 } else\r
59 if( window.ontouchstart || window.DocumentTouch /* && document instanceof DocumentTouch */ ){\r
60         X.View.Event.IdToName[ X.View.Event.POINTER_START ] = 'touchstart';\r
61         X.View.Event.IdToName[ X.View.Event.POINTER_END   ] = 'touchend';\r
62         X.View.Event.IdToName[ X.View.Event.POINTER_MOVE  ] = 'touchmove';\r
63         X.View.Event.NameToID[ 'touchstart' ] = X.View.Event.POINTER_START;\r
64         X.View.Event.NameToID[ 'touchend'   ] = X.View.Event.POINTER_END;\r
65         X.View.Event.NameToID[ 'touchmove'  ] = X.View.Event.POINTER_MOVE;\r
66 } else {\r
67         X.View.Event.IdToName[ X.View.Event.POINTER_START ] = 'mousedown';\r
68         X.View.Event.IdToName[ X.View.Event.POINTER_END   ] = 'mouseup';\r
69         X.View.Event.IdToName[ X.View.Event.POINTER_MOVE  ] = 'mousemove';\r
70         X.View.Event.NameToID[ 'mousedown' ] = X.View.Event.POINTER_START;\r
71         X.View.Event.NameToID[ 'mouseup'   ] = X.View.Event.POINTER_END;\r
72         X.View.Event.NameToID[ 'mousemove' ] = X.View.Event.POINTER_MOVE;\r
73 };\r
74 \r
75 X.View = (function( window, document ){\r
76         var view,\r
77                 lock = 0, w = 0, h = 0,\r
78                 resize, delayResize;\r
79 \r
80 /* -----------------------------------------------\r
81  * Resize\r
82  *  uupaa.js\r
83  */\r
84         function unlock(){ lock = 0; };\r
85         \r
86         if( X.UA.IE ){\r
87                 resize = function(){\r
88                         var size, i, l;\r
89                         if( !lock++ ){\r
90                                 size = X.View.getSize();\r
91                                 if( w !== size[ 0 ] || h !== size[ 1 ] ){// VIEW_RESIZED\r
92                                         w = size[ 0 ];\r
93                                         h = size[ 1 ];\r
94                                         X.View.dispatch( { type : X.View.Event.VIEW_RESIZED, w : w, h : h } );\r
95                                 };\r
96                                 X.Timer.once( 1, unlock );// delay unlock\r
97                         };\r
98                 };\r
99         } else {\r
100                 resize = function(){\r
101                         !lock++ && X.Timer.once( 40, delayResize );\r
102                 };\r
103                 delayResize = function(){\r
104                         var size = X.View.getSize(),\r
105                                 i, l;\r
106                         if( w !== size[ 0 ] || h !== size[ 1 ] ){// VIEW_RESIZED\r
107                                 w = size[ 0 ];\r
108                                 h = size[ 1 ];\r
109                                 X.View.dispatch( { type : X.View.Event.VIEW_RESIZED, w : w, h : h } );\r
110                         };\r
111                         X.Timer.once( 1, unlock );\r
112                 };\r
113         };\r
114         \r
115         X.View = X.Class._override(\r
116                 new X.EventDispatcher(),\r
117                 {\r
118                         ready : false,\r
119                         getPointerPosition : function(){\r
120                                 \r
121                         },\r
122                         /* 要素が視界に入った  http://remysharp.com/2009/01/26/element-in-view-event-plugin/ */\r
123                         inView : function( elm ){\r
124                                 \r
125                         },\r
126                         _init : function(){\r
127                                 var s;\r
128                                 if( X.View.ready ) return X.Callback.UN_LISTEN;\r
129                                 if( s = X.View._script ){\r
130                                         s.parentNode.removeChild( s );\r
131                                         s.onreadystatechange = new Function();\r
132                                         s.onreadystatechange = null;\r
133                                         delete X.View._script;\r
134                                 };\r
135                                 delete X.View._init;\r
136                                 X.View.ready = true;\r
137                                 X.View.dispatch( { type : X.View.Event.SYS_READY } );\r
138                                 return X.Callback.UN_LISTEN;\r
139                         },\r
140                         Event : X.View.Event\r
141                 }\r
142         );\r
143         \r
144         X.View.listenOnce( X.View.Event.SYS_READY, function(){\r
145                 var b, x;\r
146                 if( X.UA.IE && X.UA.IE < 9 ){\r
147                         X.Timer.add( 100, resize );\r
148                         b = document.body;\r
149                         b.appendChild( x = document.createElement( 'div' ) );\r
150                         x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';\r
151                         b.className += [ b.className === '' ? '' : ' ', 'ActiveX-', 1 < x.offsetHeight ? 'enabled' : 'disabled' ].join( '' );\r
152                         b.removeChild( x );\r
153                 } else {\r
154                         X.Dom.Event.add( window, 'resize', resize );\r
155                 };\r
156                 \r
157                 view = X.UA.IE ? ( document.compatMode !== "CSS1Compat" ? ( b || document.body ) : document.documentElement ) : window;\r
158                 \r
159                 X.View._view = view,\r
160                 X.View.getSize = view.innerWidth ?\r
161                         ( function(){\r
162                                 return [ view.innerWidth, view.innerHeight ];\r
163                         }) :\r
164                         ( function(){\r
165                                 return [ view.clientWidth, view.clientHeight ];\r
166                         });\r
167         });\r
168                 \r
169         return X.View;\r
170 })( window, document );\r
171 \r
172 /* -----------------------------------------------\r
173  * Document Ready\r
174  *  Dean Edwards/Matthias Miller/John Resig\r
175  */\r
176 /* for ie9+/Mozilla/Opera9 */\r
177 if( document.addEventListener ){\r
178         X.Dom.Event.add( document, 'DOMContentLoaded', X.View._init );\r
179 } else\r
180 if( 5 <= X.UA.IE ){\r
181         // if this script in Head\r
182         document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );\r
183         X.View._script = document.getElementById( "__ie_onload" );\r
184         X.View._script.onreadystatechange = function(){\r
185                 this.readyState === 'complete' && X.View._init();\r
186         };\r
187 } else\r
188 if( X.UA.WebKit ){ // sniff\r
189         X.Timer.add( 10, function(){\r
190                 if( !X.View._init ) return X.Callback.UN_LISTEN;\r
191                 if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.View._init();\r
192         });\r
193 };\r
194 \r
195 /* for other browsers */\r
196 X.Dom.Event.add( window, 'load', X.View._init );\r
197 \r
198 //\r
199 X.View.listen( X.View.Event.SYS_READY, function(e){ console.log( 'X.View DomReady ' + X.View.ready ) } );\r
200 \r
201 X.View.listen( X.View.Event.VIEW_RESIZED, function(e){ console.log( 'X.View VIEW_RESIZED ' + e.w + 'x' + e.h ) } );\r
202 \r