2 // ------------------------------------------------------------------------- //
\r
3 // ------------ local variables -------------------------------------------- //
\r
4 // ------------------------------------------------------------------------- //
\r
5 var X_UA = (function( n, undefined ){
\r
9 tv = parseFloat(dav),
\r
11 tridentToVer, i, j, v;
\r
13 console.log( ' userAgent : ' + dua );
\r
15 console.log( ' appVersion : ' + dav );
\r
17 console.log( ' platform : ' + sys );
\r
20 // TODO 3DS, DSi, WiiU
\r
22 if( sys.indexOf( 'iP' ) === 0 ){
\r
24 v = dua.split( 'OS ' )[ 1 ].split( '_' );
\r
25 i = window.devicePixelRatio === 1;
\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
31 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;
\r
33 if( screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height ){
\r
34 v = true; // 4:3 model
\r
37 if( sys === 'iPhone' ){
\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
43 if( sys === 'iPad' ){
\r
45 if( i ) acme.iPod_2Mini1 = true;
\r
47 if( sys === 'iPod' ){
\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
54 console.log( '>> iOS : ' + acme.iOS );
\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
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
68 if( sys.indexOf( 'Mac' ) + 1 ){
\r
69 console.log( 'Mac' );
\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
75 if( sys.indexOf( 'Linux' ) + 1 ){
\r
76 console.log( 'Linux' );
\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
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
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
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
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
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
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
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
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
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
178 acme.GeckoMajor = parseFloat( v[ 0 ] ) || 0;
\r
179 acme.GeckoMinor = parseFloat( v[ 1 ] ) || 0;
\r
180 acme.GeckoPatch = parseFloat( v[ 2 ] ) || 0;
\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
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
196 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\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
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
213 console.log( '>> Gecko : ' + acme.Gecko );
\r
217 if( window.chrome ){
\r
219 console.log( '>>Blink : ' + acme.Blink );
\r
222 if( dav.indexOf( 'Konqueror' ) !== -1 ){
\r
224 console.log( '>>Khtml : ' + acme.Khtml );
\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
236 if( i = parseFloat(dua.split('WebKit\/')[1]) ){
\r
239 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;
\r
241 // TODO webkit Opera
\r
243 console.log( '>>Webkit : ' + acme.WebKit );
\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
282 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );
\r
285 //http://www.useragentstring.com/pages/Iris/
\r
286 if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;
\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
302 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );
\r
305 * http://d.hatena.ne.jp/t-uchima/20051003/p1
\r
306 * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。
\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
313 X_UA_DOM.W3C = true;
\r
314 X_UA_EVENT.IE = true;
\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
321 if( document.attachEvent ){
\r
322 X_UA_EVENT.IE = true;
\r
324 X_UA_EVENT.DOM0 = true;
\r
327 if( document.layers ){
\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
336 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );
\r
338 // Safari 3.1 未満は開発コンソールがない!
\r
339 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html
\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
349 // ------------------------------------------------------------------------- //
\r
350 // --- interface ----------------------------------------------------------- //
\r
351 // ------------------------------------------------------------------------- //
\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
362 X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );
\r
365 X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );
\r