OSDN Git Service

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