OSDN Git Service

Version 0.6.5
[pettanr/clientJs.git] / 0.6.x / js / core / 14_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( 'ontouchstart' in window || 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 = X.UA.IE ?\r
77                 ( document.compatMode !== "CSS1Compat" ? document.body : document.documentElement ) : window,\r
78                 lock = 0, w = 0, h = 0,\r
79                 resize, delayResize;\r
80 \r
81 /* -----------------------------------------------\r
82  * Resize\r
83  *  uupaa.js\r
84  */\r
85         function unlock(){ lock = 0; };\r
86         \r
87         if( X.UA.IE ){\r
88                 resize = function(){\r
89                         var size, i, l;\r
90                         if( !lock++ ){\r
91                                 size = X.View.getSize();\r
92                                 if( w !== size[ 0 ] || h !== size[ 1 ] ){// VIEW_RESIZED\r
93                                         w = size[ 0 ];\r
94                                         h = size[ 1 ];\r
95                                         X.View.dispatch( { type : X.View.Event.VIEW_RESIZED, w : w, h : h } );\r
96                                 };\r
97                                 X.Timer.once( 1, unlock );// delay unlock\r
98                         };\r
99                 };\r
100         } else {\r
101                 resize = function(){\r
102                         !lock++ && X.Timer.once( 40, delayResize );\r
103                 };\r
104                 delayResize = function(){\r
105                         var size = X.View.getSize(),\r
106                                 i, l;\r
107                         if( w !== size[ 0 ] || h !== size[ 1 ] ){// VIEW_RESIZED\r
108                                 w = size[ 0 ];\r
109                                 h = size[ 1 ];\r
110                                 X.View.dispatch( { type : X.View.Event.VIEW_RESIZED, w : w, h : h } );\r
111                         };\r
112                         X.Timer.once( 1, unlock );\r
113                 };\r
114         };\r
115         \r
116         X.View = X.Class._override( new X.EventDispatcher(),\r
117                 {\r
118                         ready : false,\r
119                         _view : view,\r
120                         getSize : ( view.innerWidth ?\r
121                                 ( function(){\r
122                                         return [ view.innerWidth, view.innerHeight ];\r
123                                 }) :\r
124                                 ( function(){\r
125                                         return [ view.clientWidth, view.clientHeight ];\r
126                                 })\r
127                         ),\r
128                         getPointerPosition : function(){\r
129                                 \r
130                         },\r
131                         /* 要素が視界に入った  http://remysharp.com/2009/01/26/element-in-view-event-plugin/ */\r
132                         inView : function( elm ){\r
133                                 \r
134                         },\r
135                         _init : function(){\r
136                                 var s;\r
137                                 if( X.View.ready ) return X.Callback.UN_LISTEN;\r
138                                 if( s = X.View._script ){\r
139                                         s.parentNode.removeChild( s );\r
140                                         s.onreadystatechange = new Function();\r
141                                         s.onreadystatechange = null;\r
142                                         delete X.View._script;\r
143                                 };\r
144                                 delete X.View._init;\r
145                                 X.View.ready = true;\r
146                                 X.View.dispatch( { type : X.View.Event.SYS_READY } );\r
147                                 return X.Callback.UN_LISTEN;\r
148                         },\r
149                         Event : X.View.Event\r
150                 }\r
151         );\r
152                 \r
153         X.View.listenOnce( X.View.Event.SYS_READY, function(){\r
154                 var b, x;\r
155                 if( X.UA.IE && X.UA.IE < 9 ){\r
156                         X.Timer.add( 100, resize );\r
157                         b = document.body;\r
158                         b.appendChild( x = document.createElement( 'div' ) );\r
159                         x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';\r
160                         b.className += [ b.className === '' ? '' : ' ', 'ActiveX-', 1 < x.offsetHeight ? 'enabled' : 'disabled' ].join( '' );\r
161                         b.removeChild( x );\r
162                 } else {\r
163                         X.DomEvent.add( window, 'resize', resize );\r
164                 };\r
165         });\r
166                 \r
167         return X.View;\r
168 })( window, document );\r
169 \r
170 \r
171 /* -----------------------------------------------\r
172  * Document Ready\r
173  *  Dean Edwards/Matthias Miller/John Resig\r
174  */\r
175 /* for ie9+/Mozilla/Opera9 */\r
176 if( document.addEventListener ){\r
177         X.DomEvent.add( document, 'DOMContentLoaded', X.View._init );\r
178 } else\r
179 if( 4 < X.UA.IE ){\r
180         // if this script in Head\r
181         document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );\r
182         X.View._script = document.getElementById( "__ie_onload" );\r
183         X.View._script.onreadystatechange = function(){\r
184                 this.readyState === 'complete' && X.View._init();\r
185         };\r
186 } else\r
187 if( X.UA.WebKit ){ // sniff\r
188         X.Timer.add( 10, function(){\r
189                 if( !X.View._init ) return X.Callback.UN_LISTEN;\r
190                 if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.View._init();\r
191         });\r
192 };\r
193 \r
194 /* for other browsers */\r
195 X.DomEvent.add( window, 'load', X.View._init );\r
196 \r
197 //\r
198 X.View.listen( X.View.Event.SYS_READY, function(e){ console.log( 'X.View DomReady ' + X.View.ready ) } );\r
199 \r
200 X.View.listen( X.View.Event.VIEW_RESIZED, function(e){ console.log( 'X.View VIEW_RESIZED ' + e.w + 'x' + e.h ) } );\r