OSDN Git Service

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