2 // ------------------------------------------------------------------------- //
\r
3 // ------------ local variables -------------------------------------------- //
\r
4 // ------------------------------------------------------------------------- //
\r
5 var X_UA = (function( n, undefined ){
\r
9 tv = parseFloat(dav),
\r
10 tridentToVer, i, j, v;
\r
12 console.log( ' userAgent : ' + dua );
\r
14 console.log( ' appVersion : ' + dav );
\r
16 console.log( ' platform : ' + n.platform );
\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
27 if( n.platform.indexOf( 'Mac' ) + 1 ){
\r
28 console.log( 'Mac' );
\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
34 if( n.platform.indexOf( 'Linux' ) + 1 ){
\r
35 console.log( 'Linux' );
\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
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
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
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
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
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
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
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
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
132 acme.GeckoMajor = parseFloat( v[ 0 ] ) || 0;
\r
133 acme.GeckoMinor = parseFloat( v[ 1 ] ) || 0;
\r
134 acme.GeckoPatch = parseFloat( v[ 2 ] ) || 0;
\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
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
149 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\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
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
166 console.log( '>> Gecko : ' + acme.Gecko );
\r
170 if( window.chrome ){
\r
172 console.log( '>>Blink : ' + acme.Blink );
\r
175 if( dav.indexOf( 'Konqueror' ) !== -1 ){
\r
177 console.log( '>>Khtml : ' + acme.Khtml );
\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
184 if( i = parseFloat(dua.split('WebKit\/')[1]) ){
\r
187 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;
\r
189 // TODO webkit Opera
\r
191 console.log( '>>Webkit : ' + acme.WebKit );
\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
230 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );
\r
233 // TODO 3DS, DSi, WiiU
\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
240 if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){
\r
242 v = dua.split( 'OS ' )[ 1 ].split( '_' );
\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
248 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;
\r
250 console.log( '>> iOS : ' + acme.iOS );
\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
257 //http://www.useragentstring.com/pages/Iris/
\r
258 if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;
\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
274 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );
\r
277 * http://d.hatena.ne.jp/t-uchima/20051003/p1
\r
278 * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。
\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
285 X_UA_DOM.W3C = true;
\r
286 X_UA_EVENT.IE = true;
\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
293 if( document.attachEvent ){
\r
294 X_UA_EVENT.IE = true;
\r
296 X_UA_EVENT.DOM0 = true;
\r
299 if( document.layers ){
\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
308 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );
\r
310 // Safari 3.1 未満は開発コンソールがない!
\r
311 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html
\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
321 // ------------------------------------------------------------------------- //
\r
322 // --- interface ----------------------------------------------------------- //
\r
323 // ------------------------------------------------------------------------- //
\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
334 X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );
\r
337 X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );
\r