OSDN Git Service

52da87eae2a801f56788feff09bfd18cdeeea387
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 02_XUA.js
1 \r
2 // ------------------------------------------------------------------------- //\r
3 // ------------ local variables -------------------------------------------- //\r
4 // ------------------------------------------------------------------------- //\r
5 \r
6 /**\r
7  * UserAgent の関する定数を保持する。\r
8  * @namespace X.UA\r
9  * @alias X.UA\r
10  * @type {object}\r
11  */\r
12 var X_UA = X[ 'UA' ] = {},\r
13         X_UA_classNameForHTML = 'js-enabled ';\r
14 \r
15 (function(){\r
16         var dua  = navigator.userAgent,\r
17                 dav  = navigator.appVersion,\r
18                 tv   = parseFloat(dav),\r
19                 sys  = navigator.platform,\r
20                 tridentToVer, i, j, v;\r
21                 \r
22         console.log( ' userAgent  : ' + dua );\r
23         console.log( '-' );\r
24         console.log( ' appVersion : ' + dav );\r
25         console.log( '-' );\r
26         console.log( ' platform   : ' + sys );\r
27         console.log( '-' );\r
28         \r
29         // TODO 3DS, DSi, WiiU\r
30         \r
31         if( sys.indexOf( 'iP' ) === 0 ){\r
32 \r
33                 v = dua.split( 'OS ' )[ 1 ].split( '_' );\r
34                 i = window.devicePixelRatio === 1;\r
35                 /**\r
36                  * @alias X.UA.iOSMajor\r
37                  * @type {number}\r
38                  */\r
39                 X_UA[ 'iOSMajor' ] = parseFloat( v[ 0 ] ) || 0;\r
40                 /**\r
41                  * @alias X.UA.iOSMinor\r
42                  * @type {number}\r
43                  */\r
44                 X_UA[ 'iOSMinor' ]  = parseFloat( v[ 1 ] ) || 0;\r
45                 /**\r
46                  * @alias X.UA.iOSPatch\r
47                  * @type {number}\r
48                  */\r
49                 X_UA[ 'iOSPatch' ]  = parseFloat( v[ 2 ] ) || 0;\r
50                 /**\r
51                  * @alias X.UA.iOS\r
52                  * @type {number}\r
53                  */\r
54                 X_UA[ 'iOS' ]  = X_UA[ 'iOSMajor' ] + X_UA[ 'iOSMinor' ]  / 10;\r
55 \r
56                 if( screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height ){\r
57                         v = true; // 4:3 model\r
58                 };\r
59                 \r
60                 if( sys === 'iPhone' ){\r
61                         /**\r
62                          * @alias X.UA.iPhone\r
63                          * @type {boolean}\r
64                          */\r
65                         X_UA[ 'iPhone' ]  = true;\r
66                         if( v ){\r
67                                 /**\r
68                                  * iPhone4s以下\r
69                                  * @alias X.UA.iPhone_4s\r
70                                  * @type {boolean}\r
71                                  */\r
72                                 X_UA[ 'iPhone_4s' ]  = true;\r
73                         };\r
74                         if( v && i ){\r
75                                 /**\r
76                                  * iPhone3GS以下\r
77                                  * @alias X.UA.iPhone_3GS\r
78                                  * @type {boolean}\r
79                                  */\r
80                                 X_UA[ 'iPhone_3GS' ]  = true;\r
81                         };\r
82                         //alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ]  ? '3GS以下' : X_UA[ 'iPhone_4s' ]  ? '4s以下' : '5以上' ) );\r
83                 };\r
84                 if( sys === 'iPad' ){\r
85                         /**\r
86                          * @alias X.UA.iPad\r
87                          * @type {boolean}\r
88                          */\r
89                         X_UA[ 'iPad' ]    = true;\r
90                         if( i ){\r
91                                 /**\r
92                                  * iPad2以下または初代iPad mini 以下\r
93                                  * @alias X.UA.iPad_2Mini1\r
94                                  * @type {boolean}\r
95                                  */\r
96                                 X_UA[ 'iPad_2Mini1' ]  = true;\r
97                         };\r
98                 };\r
99                 if( sys === 'iPod' ){\r
100                         /**\r
101                          * @alias X.UA.iPod\r
102                          * @type {boolean}\r
103                          */\r
104                         X_UA[ 'iPod' ]    = true;\r
105                         if( v && i ){\r
106                                 /**\r
107                                  * iPod3以下\r
108                                  * @alias X.UA.iPod_3\r
109                                  * @type {boolean}\r
110                                  */\r
111                                 X_UA[ 'iPod_3' ]  = true;\r
112                         };\r
113                         if( v ){\r
114                                 /**\r
115                                  * iPod4以下\r
116                                  * @alias X.UA.iPod_4\r
117                                  * @type {boolean}\r
118                                  */\r
119                                 X_UA[ 'iPod_4' ]  = true;\r
120                         };\r
121                         //alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ]  ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) );\r
122                 };\r
123                 \r
124                 console.log( '>> iOS : ' + X_UA[ 'iOS' ]  );\r
125         } else\r
126         if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){\r
127                 /**\r
128                  * http://user-agent-string.info/list-of-ua/os-detail?os=webOS\r
129                  * @alias X.UA.webOS\r
130                  * @type {boolean}\r
131                  */\r
132                 X_UA[ 'webOS' ]  = true; // webOS\r
133         } else\r
134         if( sys.indexOf( 'Win' ) + 1 ){\r
135                 console.log( 'Win' );\r
136                 /**\r
137                  * @alias X.UA.Windows\r
138                  * @type {boolean}\r
139                  */\r
140                 X_UA[ 'Windows' ]  = true;\r
141                 switch( sys ){\r
142                         case 'Win16' :\r
143                         case 'Win32' :\r
144                         case 'Win64' :\r
145                         case 'WinCE' :\r
146                                 /**\r
147                                  * @alias X.UA.Win16\r
148                                  * @alias X.UA.Win32\r
149                                  * @alias X.UA.Win64\r
150                                  * @alias X.UA.WinCE\r
151                                  * @type {boolean}\r
152                                  */\r
153                                 X_UA[ sys ] = true;\r
154                 };\r
155                 // winRT\r
156         } else\r
157         if( sys.indexOf( 'Mac' ) + 1 ){\r
158                 console.log( 'Mac' );\r
159                 /**\r
160                  * @alias X.UA.Mac\r
161                  * @type {boolean}\r
162                  */\r
163                 X_UA[ 'Mac' ]  = true;\r
164                 switch( sys ){\r
165                         case 'MacPowerPC' :\r
166                                 /**\r
167                                  * @alias X.UA.MacPPC\r
168                                  * @type {boolean}\r
169                                  */\r
170                                 X_UA[ 'MacPPC' ] = true;\r
171                                 break;\r
172                         case 'MacPPC' :\r
173                         case 'Mac68K' :\r
174                         case 'MacIntel' :\r
175                                 /**\r
176                                  * @alias X.UA.MacPPC\r
177                                  * @alias X.UA.Mac68K\r
178                                  * @alias X.UA.MacIntel\r
179                                  * @type {boolean}\r
180                                  */\r
181                                 X_UA[ sys ] = true;\r
182                 };\r
183         } else\r
184         if( ( sys.indexOf( 'Linux' ) + 1 ) || ( sys.indexOf( 'Android' ) + 1 ) ){\r
185                 console.log( 'Linux' );\r
186                 /**\r
187                  * @alias X.UA.Linux\r
188                  * @type {boolean}\r
189                  */\r
190                 X_UA[ 'Linux' ]  = true;\r
191                 \r
192                 if( ( i = dua.indexOf( 'Android' ) ) !== -1 ){\r
193                         /**\r
194                          * Firefox で Version が取れない!\r
195                          * http://bizmakoto.jp/bizid/articles/1207/31/news004.html\r
196                          * Chrome       Android 4.0以上       Google\r
197                          * Dolphin Browser HD   Android 2.0.1以上     Mobotap\r
198                          * Firefox      Android 2.2以上       Mozilla\r
199                          * Opera Mobile         Android 1.6以上       Opera Software ASA\r
200                          * Sleipnir Mobile      Android 2.1以上       Fenrir\r
201                          * @alias X.UA.Android\r
202                          * @type {number}\r
203                          */\r
204                         X_UA[ 'Android' ]  = parseFloat( dua.substr( i + 8 ) ) || 0.1;\r
205                         console.log( '>> Android : ' + X_UA[ 'Android' ]  );\r
206                 };\r
207         };\r
208         \r
209         if( window.opera ){\r
210                 i = dua.indexOf( 'Opera' ); // Opera/\r
211                 j = dua.indexOf( 'Version/' );\r
212                 /**\r
213                  * @alias X.UA.Opera\r
214                  * @type {number}\r
215                  */\r
216                 X_UA[ 'Opera' ] = v = Math.max(\r
217                         i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
218                         j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
219                         tv );\r
220                 /**\r
221                  * memo:closure compiler で minify するとOpera7で動かない \r
222                  * --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く\r
223                  * @alias X.UA.Opera7\r
224                  * @type {boolean}\r
225                  */\r
226                 X_UA[ 'Opera7' ]      = v < 8;\r
227                 /**\r
228                  * @alias X.UA.Opera78\r
229                  * @type {boolean}\r
230                  */\r
231                 X_UA[ 'Opera78' ]     = v < 9;\r
232                 /**\r
233                  * @alias X.UA.OperaMini\r
234                  * @type {boolean}\r
235                  */\r
236                 X_UA[ 'OperaMini' ]   = 0 < dua.indexOf('Opera Mini');\r
237                 /**\r
238                  * @alias X.UA.OperaMobile\r
239                  * @type {boolean}\r
240                  */\r
241                 X_UA[ 'OperaMobile' ] = 0 < dua.indexOf('Opera Mobi');\r
242                 /**\r
243                  * @alias X.UA.OperaTablet\r
244                  * @type {boolean}\r
245                  */\r
246                 X_UA[ 'OperaTablet' ] = 0 < dua.indexOf('Opera Tablet');\r
247                 /**\r
248                  * @alias X.UA.Wii\r
249                  * @type {boolean}\r
250                  */\r
251                 X_UA[ 'Wii' ]         = dua.indexOf( 'Nintendo Wii' ) !== -1;\r
252                 /**\r
253                  * @alias X.UA.NDS\r
254                  * @type {boolean}\r
255                  */\r
256                 X_UA[ 'NDS' ]         = dua.indexOf( 'Nitro' ) !== -1;\r
257                 console.log( '>> Opera : ' + v );\r
258                 return;\r
259         };\r
260         \r
261         // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
262         if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){\r
263                 /**\r
264                  * @alias X.UA.ActiveX\r
265                  * @type {boolean}\r
266                  */\r
267                 X_UA[ 'ActiveX' ]  = !!window[ 'ActiveXObject' ];\r
268                 /**\r
269                  * documentモードを考慮しないIEのバージョン\r
270                  * @alias X.UA._IE\r
271                  * @type {number}\r
272                  */\r
273                 X_UA[ '_IE' ]      = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;\r
274                 /**\r
275                  * IE11 の互換モードの navigator.appVersion にも Trident/7.0 が書かれているため互換モードか?判定ができる\r
276                  * 互換モードでは Silverlight でエラーが出る?\r
277                  * @alias X.UA.Trident\r
278                  * @type {number}\r
279                  */\r
280                 X_UA[ 'Trident' ]  = parseFloat(dav.split('Trident/')[1]) || 0;\r
281                 /**\r
282                  * documentモードを考慮したIEのバージョン\r
283                  * @alias X.UA.IE\r
284                  * @type {number}\r
285                  */\r
286                 X_UA[ 'IE' ]   = v = document.documentMode || X_UA[ '_IE' ];\r
287                 tridentToVer       = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ];\r
288                 /**\r
289                  * IE10 以上の互換モードを使用している場合、そのバージョン\r
290                  * @alias X.UA.IECompat\r
291                  * @type {number}\r
292                  */\r
293                 if( v = tridentToVer !== X_UA[ '_IE' ] && tridentToVer ) X_UA[ 'IECompat' ] = v;\r
294                 /**\r
295                  * @alias X.UA.IE4\r
296                  * @type {boolean}\r
297                  */\r
298                 if( v && v < 4.5 ) X_UA[ 'IE4' ] = true;\r
299                 /**\r
300                  * @alias X.UA.IE45\r
301                  * @type {boolean}\r
302                  */\r
303                 if( v && 4.5 <= v && v < 5 ) X_UA[ 'IE45' ] = true;\r
304                 /**\r
305                  * @alias X.UA.IE4x\r
306                  * @type {boolean}\r
307                  */\r
308                 if( X_UA[ 'IE4' ] || X_UA[ 'IE45' ] ) X_UA[ 'IE4x' ] = true;\r
309                 /**\r
310                  * @alias X.UA.IE5\r
311                  * @type {boolean}\r
312                  */\r
313                 if( 5 <= v && v < 5.5 ) X_UA[ 'IE5' ] = true;\r
314                 /**\r
315                  * @alias X.UA.IE55\r
316                  * @type {boolean}\r
317                  */\r
318                 if( 5.5 <= v && v < 6 ) X_UA[ 'IE55' ] = true;\r
319                 /**\r
320                  * @alias X.UA.IE5x\r
321                  * @type {boolean}\r
322                  */\r
323                 if( X_UA[ 'IE5' ] || X_UA[ 'IE55' ] ) X_UA[ 'IE5x' ] = true;\r
324                 /**\r
325                  * @alias X.UA.IE6\r
326                  * @type {boolean}\r
327                  */\r
328                 if( 6 <= v && v < 7 ) X_UA[ 'IE6' ] = true;\r
329                 /**\r
330                  * @alias X.UA.IE7\r
331                  * @type {boolean}\r
332                  */\r
333                 if( 7 <= v && v < 8 ) X_UA[ 'IE7' ] = true;\r
334                 /**\r
335                  * @alias X.UA.IE8\r
336                  * @type {boolean}\r
337                  */\r
338                 if( 8 <= v && v < 9 ) X_UA[ 'IE8' ] = true;\r
339                 /**\r
340                  * @alias X.UA.IE9\r
341                  * @type {boolean}\r
342                  */\r
343                 if( 9 <= v && v < 10 ) X_UA[ 'IE9' ] = true;\r
344                 /**\r
345                  * @alias X.UA.MacIE\r
346                  * @type {boolean}\r
347                  */\r
348                 if( X_UA[ 'Mac' ] ) X_UA[ 'MacIE' ] = true;\r
349                 /**\r
350                  * @alias X.UA.IEMobile\r
351                  * @type {boolean}\r
352                  */\r
353                 if( dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || X_UA[ 'WinCE' ] ) X_UA[ 'IEMobile' ] = true;\r
354                 /**\r
355                  * @alias X.UA.WinPhone\r
356                  * @type {boolean}\r
357                  */\r
358                 if( dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ) ) X_UA[ 'WinPhone' ] = true; // ZuneWP は IEM のデスクトップモードで登場する\r
359                 \r
360                 console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] );\r
361                 // TODO XBox360, XBox1, Modern or Desktop, Standalone\r
362                 return;\r
363         };\r
364         \r
365         // \r
366         if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){\r
367                 /**\r
368                  * http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html\r
369                  * @alias X.UA.NetFront\r
370                  * @type {number}\r
371                  */\r
372                 X_UA[ 'NetFront' ] = parseFloat( dua.substr( i + 9 ) ) || 0.1;\r
373                 console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] );\r
374                 return;\r
375         };\r
376         \r
377         if( X_UA[ 'Linux' ] && tv === 2 && dua.indexOf( 'Sony\/COM2\/' ) !== -1 ){\r
378                 X_UA[ 'NetFront' ] = 3.4;\r
379                 console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] );\r
380                 return;\r
381         };\r
382         \r
383         if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){\r
384                 /**\r
385                  * PlayStation 3 システムバージョン 4.10 未満の SONY 独自ブラウザ\r
386                  * http://www.useragentstring.com/pages/Playstation%203/\r
387                  * Mozilla/5.0 (PLAYSTATION 3; 3.55)\r
388                  * Mozilla/4.0 (PS3 (PlayStation 3); 1.00)\r
389                  * https://github.com/Famous/famous/blob/1a02c8084587d80519ea4bd3b55649ab32ee2e65/examples/assets/lib/require.js\r
390                  * PS3 ブラウザのロードイベントについて\r
391                  * @alias X.UA.PS3\r
392                  * @type {number}\r
393                  */\r
394                 X_UA[ 'PS3' ] = parseFloat( dua.substr( i + 15 ) ) || 0.1;\r
395                 console.log( '>> PS3 : ' + X_UA[ 'PS3' ] );\r
396                 return;\r
397         };\r
398         \r
399         if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){\r
400                 /**\r
401                  * http://www.useragentstring.com/pages/iCab/\r
402                  * iCab/3.0.2 (Macintosh; U; PPC Mac OS X)\r
403                  * Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3\r
404                  * @alias X.UA.iCab\r
405                  * @type {number}\r
406                  */\r
407                 X_UA[ 'iCab' ] = parseFloat( dua.substr( i + 5 ) ) || 0.1;\r
408                 console.log( '>> iCab : ' + X_UA[ 'iCab' ] );\r
409                 return;\r
410         };\r
411         \r
412         if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){\r
413                 v = dua.substr( i + 3 ).split( '.' );\r
414                 /**\r
415                  * メジャーバージョン + マイナーバージョン\r
416                  * @alias X.UA.Gecko\r
417                  * @type {number}\r
418                  */\r
419                 X_UA[ 'Gecko' ] = parseFloat( v[ 0 ] ) || 0 +\r
420                         ( parseFloat( v[ 1 ] ) || 0 ) / 10 +\r
421                         ( parseFloat( v[ 2 ] ) || 0 ) / 100;\r
422                 /**\r
423                  * @alias X.UA.GeckoMajor\r
424                  * @type {number}\r
425                  */\r
426                 X_UA[ 'GeckoMajor' ] = parseFloat( v[ 0 ] ) || 0;\r
427                 /**\r
428                  * @alias X.UA.GeckoMinor\r
429                  * @type {number}\r
430                  */\r
431                 X_UA[ 'GeckoMinor' ] = parseFloat( v[ 1 ] ) || 0;\r
432                 /**\r
433                  * @alias X.UA.GeckoPatch\r
434                  * @type {number}\r
435                  */\r
436                 X_UA[ 'GeckoPatch' ] = parseFloat( v[ 2 ] ) || 0;\r
437                 \r
438                 //Fennec\r
439                 if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){\r
440                         /**\r
441                          * Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0\r
442                          * @alias X.UA.Fennec\r
443                          * @type {number}\r
444                          */\r
445                         X_UA[ 'Fennec' ] = parseFloat( dua.substr( i + 7 ) );\r
446                         console.log( '>> Fennec : ' + X_UA[ 'Fennec' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );\r
447                         return;\r
448                 };\r
449                 //Firefox\r
450                 \r
451                 //Netscape\r
452                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3\r
453                 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){\r
454                         /**\r
455                          * @alias X.UA.NN\r
456                          * @type {number}\r
457                          */\r
458                         X_UA[ 'NN' ]  = parseFloat( dua.substr( i + 10 ) ) || 6;\r
459                         /**\r
460                          * @alias X.UA.NN6\r
461                          * @type {boolean}\r
462                          */\r
463                         X_UA[ 'NN6' ] = true;\r
464                         console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );\r
465                         return;\r
466                 } else\r
467                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)\r
468                 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3\r
469                 if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){\r
470                         X_UA[ 'NN' ] = parseFloat( dua.substr( i + 9 ) ) || 7;\r
471                         console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );\r
472                         return;\r
473                 } else\r
474                 //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
475                 if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){\r
476                         X_UA[ 'NN' ] = parseFloat( dua.substr( i + 10 ) ) || 9;\r
477                         console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );\r
478                         return;\r
479                 };\r
480                 \r
481                 console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] );\r
482         };\r
483         \r
484         // TODO Blink\r
485         if( window.chrome ){\r
486                 /**\r
487                  * @alias X.UA.Blink\r
488                  * @type {number}\r
489                  */\r
490                 X_UA[ 'Blink' ] = tv;\r
491                 console.log( '>>Blink : ' + X_UA[ 'Blink' ] );\r
492                 \r
493         } else\r
494         if( dav.indexOf( 'Konqueror' ) !== -1 ){\r
495                 /**\r
496                  * @alias X.UA.Khtml\r
497                  * @type {number}\r
498                  */\r
499                 X_UA[ 'Khtml' ] = tv;\r
500                 console.log( '>>Khtml : ' + X_UA[ 'Khtml' ] );\r
501                 \r
502         } else\r
503         if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){\r
504                 /**\r
505                  * Android 標準ブラウザ\r
506                  * @alias X.UA.AndroidBrowser\r
507                  * @type {number}\r
508                  */\r
509                 X_UA[ 'AndroidBrowser' ] = i = parseFloat( dua.substr( i + 8 ) ) || 0.1;\r
510                 /**\r
511                  * @alias X.UA.AndroidBrowser1\r
512                  * @type {boolean}\r
513                  */\r
514                 X_UA[ 'AndroidBrowser1' ] = 1 <= i && i < 2;\r
515                 /**\r
516                  * @alias X.UA.AndroidBrowser2\r
517                  * @type {boolean}\r
518                  */\r
519                 X_UA[ 'AndroidBrowser2' ] = 2 <= i && i < 3;\r
520                 /**\r
521                  * @alias X.UA.AndroidBrowser3\r
522                  * @type {boolean}\r
523                  */\r
524                 X_UA[ 'AndroidBrowser3' ] = 3 <= i && i < 4;\r
525                 /**\r
526                  * @alias X.UA.AndroidBrowser4\r
527                  * @type {boolean}\r
528                  */\r
529                 X_UA[ 'AndroidBrowser4' ] = 4 <= i && i < 5;\r
530                 /**\r
531                  * @alias X.UA.AndroidBrowser5\r
532                  * @type {boolean}\r
533                  */\r
534                 X_UA[ 'AndroidBrowser5' ] = 5 <= i && i < 6;\r
535                 console.log( '>> AndroidBrowser : ' + X_UA[ 'Android' ] );\r
536                 \r
537                 i = parseFloat(dua.split('WebKit\/')[1]);\r
538                 /**\r
539                  * @alias X.UA.AndroidBrowserWebkit\r
540                  * @type {number}\r
541                  */\r
542                 X_UA[ 'AndroidBrowserWebkit' ] = i;\r
543                 alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
544                 \r
545         } else\r
546         if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
547                 /**\r
548                  * @alias X.UA.WebKit\r
549                  * @type {number}\r
550                  */\r
551                 X_UA[ 'WebKit' ] = i;\r
552                 \r
553                 if( v = parseFloat(dua.split('Chrome\/')[1]) ){\r
554                         /**\r
555                          * @alias X.UA.Chrome\r
556                          * @type {number}\r
557                          */\r
558                         X_UA[ 'Chrome' ] = v;\r
559                 };\r
560                 \r
561                 // TODO webkit Opera\r
562         \r
563                 console.log( '>>Webkit : ' + X_UA[ 'WebKit' ] );\r
564         \r
565                 if( i && !X_UA[ 'Chrome' ] && dua.indexOf( 'Safari' ) !== -1 ){\r
566                         if( dav.indexOf( 'Version/' ) !== -1 ){\r
567                                 /**\r
568                                  * @alias X.UA.Safari\r
569                                  * @type {number}\r
570                                  */\r
571                                 X_UA[ 'Safari' ] = parseFloat( dav.split('Version/')[1] );\r
572                         } else {\r
573                                 if( i <= 528.16 ){\r
574                                         X_UA[ 'Safari' ] = i <   73    ? 0.8 :\r
575                                                                            i <   85    ? 0.9 :\r
576                                                                            i <  100    ? 1 :\r
577                                                                            i <  125    ? 1.1 :\r
578                                                                            i <  312    ? 1.2 :\r
579                                                                            i <  412    ? 1.3 :\r
580                                                                            i <= 419.3  ? 2 :\r
581                                                                            i <= 525.13 ? 3 :\r
582                                                                            i <= 525.25 ? 3.1 : 3.2;\r
583                                 };\r
584                         };\r
585                 };              \r
586                 \r
587                 console.log( '>> Webkit : ' + X_UA[ 'WebKit' ] + ' Safari : ' + X_UA[ 'Safari' ] );\r
588         };\r
589         \r
590         if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ){\r
591                 /**\r
592                  * http://www.useragentstring.com/pages/Iris/\r
593                  * @alias X.UA.Iris\r
594                  * @type {boolean}\r
595                  */\r
596                 X_UA[ 'Iris' ] = true;\r
597         };\r
598         \r
599         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
600                 dua.indexOf( 'Kobo' ) !== -1 ||\r
601                 // 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
602                 dua.indexOf( 'Kindle' ) !== -1 ||\r
603                 // 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
604                 dua.indexOf( 'EBRD' ) !== -1\r
605                  ){\r
606                         /**\r
607                          * Kobo, Kindle, Sony Reader\r
608                          * @alias X.UA.EInk\r
609                          * @type {boolean}\r
610                          */\r
611                         X_UA[ 'EInk' ] = true;\r
612                 };\r
613 })();\r
614 \r
615 (function(){\r
616         var k, v;\r
617         if( X_UA[ 'IE45' ] || X_UA[ 'IE4' ] ){\r
618                 if( X_UA[ 'Mac' ] ){\r
619                         X_UA_classNameForHTML = 'Mac';\r
620                 } else\r
621                 if( X_UA[ 'WinCE' ] ){\r
622                         // TODO CE3 の ie4 と WM の ie4 の分岐\r
623                         X_UA_classNameForHTML = 'WinCE';\r
624                 } else\r
625                 if( X_UA[ 'Win' ] ){\r
626                         X_UA_classNameForHTML = 'Win';\r
627                 } else {\r
628                         X_UA_classNameForHTML = 'Other';\r
629                 };              \r
630                 \r
631                 X_UA_classNameForHTML += 'IE4';\r
632                 \r
633                 if( X_UA[ 'IE45' ] ){\r
634                         X_UA_classNameForHTML += '5';\r
635                 };\r
636 \r
637                 if( X_UA[ 'ActiveX' ] ){\r
638                         X_UA_classNameForHTML += 'ActiveX';\r
639                 };\r
640                 \r
641         } else {\r
642                 for( k in X_UA ){\r
643                         v = X_UA[ k ];\r
644                         if( v ){\r
645                                 X_UA_classNameForHTML += k + ' ';\r
646                                 if( v !== true ){\r
647                                         X_UA_classNameForHTML += k + v + ' ';\r
648                                 };\r
649                         };\r
650                 };              \r
651         };\r
652 })();\r
653 \r
654 var X_UA_DOM   = {},\r
655         X_UA_EVENT = {},\r
656         X_UA_HID   = {};\r
657 \r
658 /*\r
659  * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
660  * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
661  */\r
662 if( X_UA[ 'IE4' ] && X_UA[ 'IE' ] < 5 ){ // ie4 & iemobi4 & macie4.x\r
663         X_UA_DOM.IE4   = true;\r
664         X_UA_EVENT.IE4 = true;\r
665 } else\r
666 if( X_UA[ 'MacIE' ] ){\r
667         X_UA_DOM.W3C  = true;\r
668         X_UA_EVENT.IE = true;\r
669 } else\r
670 if( document.getElementById ){\r
671         X_UA_DOM.W3C = true;\r
672         if( document.addEventListener ){\r
673                 X_UA_EVENT.W3C = true;\r
674         } else\r
675         if( document.attachEvent ){\r
676                 X_UA_EVENT.IE = true;\r
677         } else {\r
678                 X_UA_EVENT.DOM0 = true;\r
679         };\r
680 } else\r
681 if( document.layers ){\r
682         \r
683 } else {\r
684         \r
685 };\r
686 \r
687 if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;\r
688 if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH   = true;\r
689 \r
690 //alert(X_UA[ 'Safari' ]  + ' ' + X_UA[ 'WebKit' ] + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
691 \r
692 // Safari 3.1 未満は開発コンソールがない!\r
693 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
694 /*\r
695 if( X_UA[ 'Safari' ]  && X_UA[ 'WebKit' ] < 525.13 ){   \r
696         window.onerror = function( x, y, z ){\r
697                 var n = String.fromCharCode( 10 );\r
698             alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');\r
699             return true;\r
700         };\r
701 };*/\r
702 \r
703 // TODO 構文のサポート instanceof, in, try catch\r
704 \r
705 if( X_UA[ 'IE' ] < 7 ){ // error @ NN7.2\r
706         X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ?\r
707                 document.execCommand && document.execCommand( 'BackgroundImageCache', false, true ) :\r
708                 (function(){\r
709                         /**\r
710                          * ie7 以下で実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。\r
711                          * bonus: hotfix for IE6 SP1 (bug KB823727)\r
712                          * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,\r
713                          * @alias X.UA.ieExeComError */\r
714                         X_UA[ 'ieExeComError' ] = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );\r
715                 })();\r
716         \r
717         X_UA[ 'ieExeComError' ] && alert( 'document.execCommand error!' );\r
718 };\r
719 \r
720 /*\r
721  * HTML5 に対応しない IE8 以下でも <a> の下に <div> を作ることができる\r
722  * その際に <div> の直前に改行文字が出現するが childNodes は長さ 1 で <div> だけの模様、、、\r
723 X_UA_ATagWrapDiv = (function( e, h ){\r
724         e = document.createElement( 'div' );\r
725         e.innerHTML = h = '<a><div></div></a>';\r
726         console.log( e.innerHTML.length + '\n' + e.firstChild.tagName );\r
727         return e.childNodes.length === 1;\r
728 })();\r
729 \r
730 console.log( 'HTML5? ' + X_UA_ATagWrapDiv ); */\r
731 \r