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
71 if( sys.indexOf( 'Mac' ) + 1 ){
\r
72 console.log( 'Mac' );
\r
84 if( sys.indexOf( 'Linux' ) + 1 ){
\r
85 console.log( 'Linux' );
\r
88 if( ( i = dua.indexOf( 'Android' ) ) !== -1 ){
\r
89 acme.Android = parseFloat( dua.substr( i + 8 ) ) || 0;
\r
90 console.log( '>> Android : ' + acme.Android );
\r
95 * http://bizmakoto.jp/bizid/articles/1207/31/news004.html
\r
96 Chrome Android 4.0以上 Google
\r
97 Dolphin Browser HD Android 2.0.1以上 Mobotap
\r
98 Firefox Android 2.2以上 Mozilla
\r
99 Opera Mobile Android 1.6以上 Opera Software ASA
\r
100 Sleipnir Mobile Android 2.1以上 Fenrir
\r
103 if( window.opera ){
\r
104 i = dua.indexOf( 'Opera' ); // Opera/
\r
105 j = dua.indexOf( 'Version/' );
\r
106 acme.Opera = Math.max(
\r
107 i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,
\r
108 j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,
\r
110 // closure compiler で minify するとOpera7で動かない
\r
111 // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く
\r
112 acme.Opera7 = acme.Opera < 8;
\r
113 acme.Opera78 = acme.Opera < 9;
\r
114 acme.OperaMini = 0 < dua.indexOf('Opera Mini');
\r
115 acme.OperaMobile = 0 < dua.indexOf('Opera Mobi');
\r
116 acme.OperaTablet = 0 < dua.indexOf('Opera Tablet');
\r
117 acme.Wii = dua.indexOf( 'Nintendo Wii' ) !== -1;
\r
118 acme.NDS = dua.indexOf( 'Nitro' ) !== -1;
\r
119 console.log( '>> Opera : ' + acme.Opera );
\r
123 // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
\r
124 if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){
\r
125 acme.ActiveX = !!window[ 'ActiveXObject' ];
\r
126 acme._IE = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;
\r
127 // IE11 の互換モードの dav にも Trident/7.0 が書かれているため互換モードか?判定ができる
\r
128 // 互換モードでは Silverlight でエラーが出る?
\r
129 acme.Trident = parseFloat(dav.split('Trident/')[1]) || 0;
\r
130 acme.IE = document.documentMode || acme._IE;
\r
131 tridentToVer = acme.Trident ? ( acme.Trident + 4 | 0 ) : acme._IE;
\r
132 acme.IECompat = /* acme.IE !== acme._IE || */ tridentToVer !== acme._IE && tridentToVer;
\r
133 acme.IE4 = acme.IE && acme.IE < 5;
\r
134 acme.IE5678 = 5 <= acme.IE && acme.IE < 9;
\r
135 acme.IE5 = 5 <= acme.IE && acme.IE < 5.5;
\r
136 acme.IE55 = 5.5 <= acme.IE && acme.IE < 6;
\r
137 acme.IE5x = acme.IE5 || acme.IE55;
\r
138 acme.IE6 = 6 <= acme.IE && acme.IE < 7;
\r
139 acme.IE7 = 7 <= acme.IE && acme.IE < 8;
\r
140 acme.IE8 = 8 <= acme.IE && acme.IE < 9;
\r
141 acme.IE9 = 9 <= acme.IE && acme.IE < 10;
\r
142 acme.MacIE = dua.indexOf( 'Mac_PowerPC' ) !== -1 || dua.indexOf( 'Mac_PPC' ) !== -1 || dua.indexOf( 'Mac_68K' ) !== -1;
\r
143 acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || acme.WinCE;
\r
144 acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;
\r
145 console.log( '>> IE : ' + acme.IE + ' ActiveX : ' + acme.ActiveX );
\r
146 // TODO XBox360, XBox1, Modern or Desktop, Standalone
\r
150 // http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html
\r
151 if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){
\r
152 acme.NetFront = parseFloat( dua.substr( i + 9 ) ) || 0;
\r
153 console.log( '>> NetFront : ' + acme.NetFront );
\r
157 if( acme.Linux && tv === 2 && dua.indexOf( 'Sony\/COM2\/' ) !== -1 ){
\r
158 acme.NetFront = 3.4;
\r
159 console.log( '>> NetFront : ' + acme.NetFront );
\r
163 // http://www.useragentstring.com/pages/Playstation%203/
\r
164 // Mozilla/5.0 (PLAYSTATION 3; 3.55)
\r
165 // Mozilla/4.0 (PS3 (PlayStation 3); 1.00)
\r
166 if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){
\r
167 acme.PS3 = parseFloat( dua.substr( i + 15 ) ) || 0;
\r
168 console.log( '>> PS3 : ' + acme.PS3 );
\r
172 // http://www.useragentstring.com/pages/iCab/
\r
173 // iCab/3.0.2 (Macintosh; U; PPC Mac OS X)
\r
174 // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3
\r
175 if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){
\r
176 acme.iCab = parseFloat( dua.substr( i + 5 ) ) || 0;
\r
177 console.log( '>> iCab : ' + acme.iCab );
\r
181 if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){
\r
182 v = dua.substr( i + 3 ).split( '.' );
\r
183 acme.Gecko = parseFloat( v[ 0 ] ) || 0 +
\r
184 ( parseFloat( v[ 1 ] ) || 0 ) / 10 +
\r
185 ( parseFloat( v[ 2 ] ) || 0 ) / 100;
\r
187 acme.GeckoMajor = parseFloat( v[ 0 ] ) || 0;
\r
188 acme.GeckoMinor = parseFloat( v[ 1 ] ) || 0;
\r
189 acme.GeckoPatch = parseFloat( v[ 2 ] ) || 0;
\r
192 // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0
\r
193 if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){
\r
194 acme.Fennec = parseFloat( dua.substr( i + 7 ) );
\r
195 console.log( '>> Fennec : ' + acme.Fennec + ', Gecko : ' + acme.Gecko );
\r
201 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3
\r
202 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){
\r
203 acme.NN = parseFloat( dua.substr( i + 10 ) ) || 6;
\r
205 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
208 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)
\r
209 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3
\r
210 if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){
\r
211 acme.NN = parseFloat( dua.substr( i + 9 ) ) || 7;
\r
212 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
215 //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
216 if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){
\r
217 acme.NN = parseFloat( dua.substr( i + 10 ) ) || 9;
\r
218 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
222 console.log( '>> Gecko : ' + acme.Gecko );
\r
226 if( window.chrome ){
\r
228 console.log( '>>Blink : ' + acme.Blink );
\r
231 if( dav.indexOf( 'Konqueror' ) !== -1 ){
\r
233 console.log( '>>Khtml : ' + acme.Khtml );
\r
236 if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){
\r
237 acme.AndroidBrowser = i = parseFloat( dua.substr( i + 8 ) ) || 0;
\r
238 acme.AndroidBrowser1 = 1 <= i && i < 2;
\r
239 acme.AndroidBrowser2 = 2 <= i && i < 3;
\r
240 acme.AndroidBrowser3 = 3 <= i && i < 4;
\r
241 acme.AndroidBrowser4 = 4 <= i && i < 5;
\r
242 acme.AndroidBrowser5 = 5 <= i && i < 6;
\r
243 console.log( '>> AndroidBrowser : ' + acme.Android );
\r
245 if( i = parseFloat(dua.split('WebKit\/')[1]) ){
\r
248 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;
\r
250 // TODO webkit Opera
\r
252 console.log( '>>Webkit : ' + acme.WebKit );
\r
254 if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){
\r
255 if( dav.indexOf( 'Version/' ) !== -1 ){
\r
256 acme.Safari = parseFloat( dav.split('Version/')[1] );
\r
291 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );
\r
294 //http://www.useragentstring.com/pages/Iris/
\r
295 if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;
\r
297 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
298 dua.indexOf( 'Kobo' ) !== -1 ||
\r
299 // 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
300 dua.indexOf( 'Kindle' ) !== -1 ||
\r
301 // 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
302 dua.indexOf( 'EBRD' ) !== -1
\r
303 ) acme.EInk = true;
\r
311 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );
\r
314 * http://d.hatena.ne.jp/t-uchima/20051003/p1
\r
315 * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。
\r
317 if( X_UA.IE4 && X_UA.IE < 5 ){ // ie4 & iemobi4 & macie4.x
\r
318 X_UA_DOM.IE4 = true;
\r
319 X_UA_EVENT.IE4 = true;
\r
322 X_UA_DOM.W3C = true;
\r
323 X_UA_EVENT.IE = true;
\r
325 if( document.getElementById ){
\r
326 X_UA_DOM.W3C = true;
\r
327 if( document.addEventListener ){
\r
328 X_UA_EVENT.W3C = true;
\r
330 if( document.attachEvent ){
\r
331 X_UA_EVENT.IE = true;
\r
333 X_UA_EVENT.DOM0 = true;
\r
336 if( document.layers ){
\r
342 if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;
\r
343 if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH = true;
\r
345 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );
\r
347 // Safari 3.1 未満は開発コンソールがない!
\r
348 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html
\r
350 if( X_UA.Safari && X_UA.WebKit < 525.13 ){
\r
351 window.onerror = function( x, y, z ){
\r
352 var n = String.fromCharCode( 10 );
\r
353 alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');
\r
358 // ------------------------------------------------------------------------- //
\r
359 // --- interface ----------------------------------------------------------- //
\r
360 // ------------------------------------------------------------------------- //
\r
365 if( X_UA.IE < 7 ){ // error @ NN7.2
\r
366 // bonus: hotfix for IE6 SP1 (bug KB823727)
\r
367 // multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,
\r
368 X_UA.IE4 || X_UA.MacIE ?
\r
369 document.execCommand && document.execCommand( 'BackgroundImageCache', false, true ) :
\r
371 X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );
\r
374 X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );
\r