OSDN Git Service

Version 0.6.112, fix X.Node.Anime, rewite X.Audio.* for AudioSprite, add X.Audio...
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 02_XUA.js
1 \r
2 // ------------------------------------------------------------------------- //\r
3 // ------------ local variables -------------------------------------------- //\r
4 // ------------------------------------------------------------------------- //\r
5 var X_UA = (function( n, undefined ){\r
6         var acme = {},\r
7                 dua  = n.userAgent,\r
8                 dav  = n.appVersion,\r
9                 tv   = parseFloat(dav),\r
10                 tridentToVer, i, j, v;\r
11                 \r
12         console.log( ' userAgent  : ' + dua );\r
13         console.log( '-' );\r
14         console.log( ' appVersion : ' + dav );\r
15         console.log( '-' );\r
16         console.log( ' platform   : ' + n.platform );\r
17         console.log( '-' );\r
18         \r
19         if( n.platform.indexOf( 'Win' ) + 1 ){\r
20                 console.log( 'Win' );\r
21                 acme.Windows = true;\r
22                 if( n.platform === 'Win16' ) acme.Win16 = true;\r
23                 if( n.platform === 'Win32' ) acme.Win32 = true;\r
24                 if( n.platform === 'Win64' ) acme.Win64 = true;\r
25                 if( n.platform === 'WinCE' ) acme.WinCE = true;\r
26         } else\r
27         if( n.platform.indexOf( 'Mac' ) + 1 ){\r
28                 console.log( 'Mac' );\r
29                 acme.Mac = true;\r
30                 if( n.platform === 'MacPPC' || n.platform === 'MacPowerPC' ) acme.MacPPC = true;\r
31                 if( n.platform === 'Mac68K' ) acme.Mac68K = true;\r
32                 if( n.platform === 'MacIntel' ) acme.MacIntel = true;\r
33         } else\r
34         if( n.platform.indexOf( 'Linux' ) + 1 ){\r
35                 console.log( 'Linux' );\r
36                 acme.Linux = true;\r
37         };\r
38 \r
39 /*\r
40  * http://bizmakoto.jp/bizid/articles/1207/31/news004.html\r
41 Chrome  Android 4.0以上       Google\r
42 Dolphin Browser HD      Android 2.0.1以上     Mobotap\r
43 Firefox         Android 2.2以上       Mozilla\r
44 Opera Mobile    Android 1.6以上       Opera Software ASA\r
45 Sleipnir Mobile         Android 2.1以上       Fenrir\r
46  */\r
47         \r
48         if( window.opera ){\r
49                 i = dua.indexOf( 'Opera' ); // Opera/\r
50                 j = dua.indexOf( 'Version/' );\r
51                 acme.Opera = Math.max(\r
52                         i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
53                         j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
54                         tv );\r
55                 // closure compiler で minify するとOpera7で動かない \r
56                 // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く\r
57                 acme.Opera7      = acme.Opera < 8;\r
58                 acme.Opera78     = acme.Opera < 9;\r
59                 acme.OperaMini   = 0 < dua.indexOf('Opera Mini');\r
60                 acme.OperaMobile = 0 < dua.indexOf('Opera Mobi');\r
61                 acme.OperaTablet = 0 < dua.indexOf('Opera Tablet');\r
62                 acme.Wii         = dua.indexOf( 'Nintendo Wii' ) !== -1;\r
63                 acme.NDS         = dua.indexOf( 'Nitro' ) !== -1;\r
64                 console.log( '>> Opera : ' + acme.Opera );\r
65                 return acme;\r
66         };\r
67         \r
68         // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
69         if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){\r
70                 acme.ActiveX  = !!window[ 'ActiveXObject' ];\r
71                 acme._IE      = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;\r
72                 // IE11 の互換モードの dav にも Trident/7.0 が書かれているため互換モードか?判定ができる\r
73                 // 互換モードでは Silverlight でエラーが出る?\r
74                 acme.Trident  = parseFloat(dav.split('Trident/')[1]) || 0;\r
75                 acme.IE       = document.documentMode || acme._IE;\r
76                 tridentToVer  = acme.Trident ? ( acme.Trident + 4 | 0 ) : acme._IE;\r
77                 acme.IECompat = /* acme.IE !== acme._IE || */ tridentToVer !== acme._IE && tridentToVer;\r
78                 acme.IE4      = acme.IE && acme.IE < 5;\r
79                 acme.IE5678   = 5 <= acme.IE && acme.IE < 9;\r
80                 acme.IE5      = 5 <= acme.IE && acme.IE < 5.5;\r
81                 acme.IE55     = 5.5 <= acme.IE && acme.IE < 6;\r
82                 acme.IE5x     = acme.IE5 || acme.IE55;\r
83                 acme.IE6      = 6 <= acme.IE && acme.IE < 7;\r
84                 acme.IE7      = 7 <= acme.IE && acme.IE < 8;\r
85                 acme.IE8      = 8 <= acme.IE && acme.IE < 9;\r
86                 acme.IE9      = 9 <= acme.IE && acme.IE < 10;\r
87                 acme.MacIE    = dua.indexOf( 'Mac_PowerPC' ) !== -1 || dua.indexOf( 'Mac_PPC' ) !== -1 || dua.indexOf( 'Mac_68K' ) !== -1;\r
88                 acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || acme.WinCE;\r
89                 acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
90                 console.log( '>> IE : ' + acme.IE + ' ActiveX : ' + acme.ActiveX );\r
91                 // TODO XBox360, XBox1, Modern or Desktop, Standalone\r
92                 return acme;\r
93         };\r
94         \r
95         // http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html\r
96         if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){\r
97                 acme.NetFront = parseFloat( dua.substr( i + 9 ) ) || 0;\r
98                 console.log( '>> NetFront : ' + acme.NetFront );\r
99                 return acme;\r
100         };\r
101         \r
102         if( acme.Linux && tv === 2 && dua.indexOf( 'Sony\/COM2\/' ) !== -1 ){\r
103                 acme.NetFront = 3.4;\r
104                 console.log( '>> NetFront : ' + acme.NetFront );\r
105                 return acme;\r
106         };\r
107         \r
108         // http://www.useragentstring.com/pages/Playstation%203/\r
109         // Mozilla/5.0 (PLAYSTATION 3; 3.55)\r
110     // Mozilla/4.0 (PS3 (PlayStation 3); 1.00)\r
111         if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){\r
112                 acme.PS3 = parseFloat( dua.substr( i + 15 ) ) || 0;\r
113                 console.log( '>> PS3 : ' + acme.PS3 );\r
114                 return acme;\r
115         };\r
116         \r
117         // http://www.useragentstring.com/pages/iCab/\r
118         // iCab/3.0.2 (Macintosh; U; PPC Mac OS X)\r
119         // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3\r
120         if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){\r
121                 acme.iCab = parseFloat( dua.substr( i + 5 ) ) || 0;\r
122                 console.log( '>> iCab : ' + acme.iCab );\r
123                 return acme;\r
124         };\r
125         \r
126         if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){\r
127                 v = dua.substr( i + 3 ).split( '.' );\r
128                 acme.Gecko = parseFloat( v[ 0 ] ) || 0 +\r
129                         ( parseFloat( v[ 1 ] ) || 0 ) / 10 +\r
130                         ( parseFloat( v[ 2 ] ) || 0 ) / 100;\r
131                 \r
132                 acme.GeckoMajor = parseFloat( v[ 0 ] ) || 0;\r
133                 acme.GeckoMinor = parseFloat( v[ 1 ] ) || 0;\r
134                 acme.GeckoPatch = parseFloat( v[ 2 ] ) || 0;\r
135                 \r
136                 //Fennec\r
137                 if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){\r
138                         acme.Fennec = parseFloat( dua.substr( i + 7 ) );\r
139                         console.log( '>> Fennec : ' + acme.Fennec + ', Gecko : ' + acme.Gecko );\r
140                         return acme;\r
141                 };\r
142                 //Firefox\r
143                 \r
144                 //Netscape\r
145                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3\r
146                 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){\r
147                         acme.NN  = parseFloat( dua.substr( i + 10 ) ) || 6;\r
148                         acme.NN6 = true;\r
149                         console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
150                         return acme;\r
151                 } else\r
152                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)\r
153                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3\r
154                 if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){\r
155                         acme.NN = parseFloat( dua.substr( i + 9 ) ) || 7;\r
156                         console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
157                         return acme;\r
158                 } else\r
159                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6\r
160                 if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){\r
161                         acme.NN = parseFloat( dua.substr( i + 10 ) ) || 9;\r
162                         console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
163                         return acme;\r
164                 };\r
165                 \r
166                 console.log( '>> Gecko : ' + acme.Gecko );\r
167         };\r
168         \r
169         // TODO Blink\r
170         if( window.chrome ){\r
171                 acme.Blink = tv;\r
172                 console.log( '>>Blink : ' + acme.Blink );\r
173                 \r
174         } else\r
175         if( dav.indexOf( 'Konqueror' ) !== -1 ){\r
176                 acme.Khtml = tv;\r
177                 console.log( '>>Khtml : ' + acme.Khtml );\r
178                 \r
179         } else\r
180         if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){\r
181                 acme.AndroidBrowser = parseFloat( dua.substr( i + 8 ) ) || 0;\r
182                 console.log( '>> AndroidBrowser : ' + acme.Android );\r
183         } else\r
184         if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
185                 acme.WebKit = i;\r
186                 \r
187                 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;\r
188                 \r
189                 // TODO webkit Opera\r
190         \r
191                 console.log( '>>Webkit : ' + acme.WebKit );\r
192         \r
193                 if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){\r
194                         if( dav.indexOf( 'Version/' ) !== -1 ){\r
195                                 acme.Safari = parseFloat( dav.split('Version/')[1] );\r
196                         } else {\r
197                                 if( i < 73 ){\r
198                                         acme.Safari = 0.8;\r
199                                 } else\r
200                                 if( i < 85 ){\r
201                                         acme.Safari = 0.9;\r
202                                 } else\r
203                                 if( i < 100 ){\r
204                                         acme.Safari = 1;\r
205                                 } else\r
206                                 if( i < 125 ){\r
207                                         acme.Safari = 1.1;\r
208                                 } else\r
209                                 if( i < 312 ){\r
210                                         acme.Safari = 1.2;\r
211                                 } else\r
212                                 if( i < 412 ){\r
213                                         acme.Safari = 1.3;\r
214                                 } else\r
215                                 if( i <= 419.3 ){\r
216                                         acme.Safari = 2;\r
217                                 } else\r
218                                 if( i <= 525.13 ){\r
219                                         acme.Safari = 3;\r
220                                 } else\r
221                                 if( i <= 525.25 ){\r
222                                         acme.Safari = 3.1;\r
223                                 } else\r
224                                 if( i <= 528.16 ){\r
225                                         acme.Safari = 3.2;\r
226                                 };\r
227                         };\r
228                 };              \r
229                 \r
230                 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
231         };\r
232         \r
233         // TODO 3DS, DSi, WiiU\r
234         \r
235         // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0\r
236         if( ( i = dua.toLowerCase().indexOf( 'android' ) ) !== -1 ){\r
237                 acme.Android = parseFloat( dua.substr( i + 8 ) ) || 0;\r
238                 console.log( '>> Android : ' + acme.Android );\r
239         } else\r
240         if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){\r
241                 \r
242                 v = dua.split( 'OS ' )[ 1 ].split( '_' );\r
243                 \r
244                 acme.iOSMajor = parseFloat( v[ 0 ] ) || 0;\r
245                 acme.iOSMinor = parseFloat( v[ 1 ] ) || 0;\r
246                 acme.iOSPatch = parseFloat( v[ 2 ] ) || 0;\r
247                 \r
248                 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;\r
249                 \r
250                 console.log( '>> iOS : ' + acme.iOS );\r
251         } else\r
252         if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){\r
253                 // http://user-agent-string.info/list-of-ua/os-detail?os=webOS\r
254                 acme.webOS = true; // webOS\r
255         };\r
256         \r
257         //http://www.useragentstring.com/pages/Iris/\r
258         if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;\r
259         \r
260         if( // Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch)\r
261                 dua.indexOf( 'Kobo' ) !== -1 ||\r
262                 // Kindle paperwhite Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+\r
263                 dua.indexOf( 'Kindle' ) !== -1 ||\r
264                 // Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1\r
265                 dua.indexOf( 'EBRD' ) !== -1\r
266                  ) acme.EInk = true;    \r
267         \r
268         return acme;\r
269 })( navigator ),\r
270 \r
271 X_UA_DOM   = {},\r
272 X_UA_EVENT = {},\r
273 X_UA_HID   = {};\r
274 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );\r
275 \r
276 /*\r
277  * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
278  * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
279  */\r
280 if( X_UA.IE4 && X_UA.IE < 5 ){ // ie4 & iemobi4 & macie4.x\r
281         X_UA_DOM.IE4   = true;\r
282         X_UA_EVENT.IE4 = true;\r
283 } else\r
284 if( X_UA.MacIE ){\r
285         X_UA_DOM.W3C  = true;\r
286         X_UA_EVENT.IE = true;\r
287 } else\r
288 if( document.getElementById ){\r
289         X_UA_DOM.W3C = true;\r
290         if( document.addEventListener ){\r
291                 X_UA_EVENT.W3C = true;\r
292         } else\r
293         if( document.attachEvent ){\r
294                 X_UA_EVENT.IE = true;\r
295         } else {\r
296                 X_UA_EVENT.DOM0 = true;\r
297         };\r
298 } else\r
299 if( document.layers ){\r
300         \r
301 } else {\r
302         \r
303 };\r
304 \r
305 if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;\r
306 if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH   = true;\r
307 \r
308 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
309 \r
310 // Safari 3.1 未満は開発コンソールがない!\r
311 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
312 /*\r
313 if( X_UA.Safari && X_UA.WebKit < 525.13 ){      \r
314         window.onerror = function( x, y, z ){\r
315                 var n = String.fromCharCode( 10 );\r
316             alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');\r
317             return true;\r
318         };\r
319 };*/\r
320 \r
321 // ------------------------------------------------------------------------- //\r
322 // --- interface ----------------------------------------------------------- //\r
323 // ------------------------------------------------------------------------- //\r
324 X.UA = X_UA;\r
325 \r
326 \r
327 \r
328 if( X_UA.IE < 7 ){ // error @ NN7.2\r
329         // bonus: hotfix for IE6 SP1 (bug KB823727)\r
330         // multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,\r
331         X_UA.IE4 || X_UA.MacIE ?\r
332                 document.execCommand && document.execCommand( 'BackgroundImageCache', false, true ) :\r
333                 (function(){\r
334                         X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );\r
335                 })();\r
336         \r
337         X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );\r
338 };\r