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 // TODO 3DS, DSi, WiiU
\r
21 if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){
\r
23 v = dua.split( 'OS ' )[ 1 ].split( '_' );
\r
25 acme.iOSMajor = parseFloat( v[ 0 ] ) || 0;
\r
26 acme.iOSMinor = parseFloat( v[ 1 ] ) || 0;
\r
27 acme.iOSPatch = parseFloat( v[ 2 ] ) || 0;
\r
29 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;
\r
31 console.log( '>> iOS : ' + acme.iOS );
\r
33 if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){
\r
34 // http://user-agent-string.info/list-of-ua/os-detail?os=webOS
\r
35 acme.webOS = true; // webOS
\r
37 if( n.platform.indexOf( 'Win' ) + 1 ){
\r
38 console.log( 'Win' );
\r
39 acme.Windows = true;
\r
40 if( n.platform === 'Win16' ) acme.Win16 = true;
\r
41 if( n.platform === 'Win32' ) acme.Win32 = true;
\r
42 if( n.platform === 'Win64' ) acme.Win64 = true;
\r
43 if( n.platform === 'WinCE' ) acme.WinCE = true;
\r
45 if( n.platform.indexOf( 'Mac' ) + 1 ){
\r
46 console.log( 'Mac' );
\r
48 if( n.platform === 'MacPPC' || n.platform === 'MacPowerPC' ) acme.MacPPC = true;
\r
49 if( n.platform === 'Mac68K' ) acme.Mac68K = true;
\r
50 if( n.platform === 'MacIntel' ) acme.MacIntel = true;
\r
52 if( n.platform.indexOf( 'Linux' ) + 1 ){
\r
53 console.log( 'Linux' );
\r
56 if( ( i = dua.indexOf( 'Android' ) ) !== -1 ){
\r
57 acme.Android = parseFloat( dua.substr( i + 8 ) ) || 0;
\r
58 console.log( '>> Android : ' + acme.Android );
\r
63 * http://bizmakoto.jp/bizid/articles/1207/31/news004.html
\r
64 Chrome Android 4.0以上 Google
\r
65 Dolphin Browser HD Android 2.0.1以上 Mobotap
\r
66 Firefox Android 2.2以上 Mozilla
\r
67 Opera Mobile Android 1.6以上 Opera Software ASA
\r
68 Sleipnir Mobile Android 2.1以上 Fenrir
\r
72 i = dua.indexOf( 'Opera' ); // Opera/
\r
73 j = dua.indexOf( 'Version/' );
\r
74 acme.Opera = Math.max(
\r
75 i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,
\r
76 j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,
\r
78 // closure compiler で minify するとOpera7で動かない
\r
79 // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く
\r
80 acme.Opera7 = acme.Opera < 8;
\r
81 acme.Opera78 = acme.Opera < 9;
\r
82 acme.OperaMini = 0 < dua.indexOf('Opera Mini');
\r
83 acme.OperaMobile = 0 < dua.indexOf('Opera Mobi');
\r
84 acme.OperaTablet = 0 < dua.indexOf('Opera Tablet');
\r
85 acme.Wii = dua.indexOf( 'Nintendo Wii' ) !== -1;
\r
86 acme.NDS = dua.indexOf( 'Nitro' ) !== -1;
\r
87 console.log( '>> Opera : ' + acme.Opera );
\r
91 // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
\r
92 if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){
\r
93 acme.ActiveX = !!window[ 'ActiveXObject' ];
\r
94 acme._IE = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;
\r
95 // IE11 の互換モードの dav にも Trident/7.0 が書かれているため互換モードか?判定ができる
\r
96 // 互換モードでは Silverlight でエラーが出る?
\r
97 acme.Trident = parseFloat(dav.split('Trident/')[1]) || 0;
\r
98 acme.IE = document.documentMode || acme._IE;
\r
99 tridentToVer = acme.Trident ? ( acme.Trident + 4 | 0 ) : acme._IE;
\r
100 acme.IECompat = /* acme.IE !== acme._IE || */ tridentToVer !== acme._IE && tridentToVer;
\r
101 acme.IE4 = acme.IE && acme.IE < 5;
\r
102 acme.IE5678 = 5 <= acme.IE && acme.IE < 9;
\r
103 acme.IE5 = 5 <= acme.IE && acme.IE < 5.5;
\r
104 acme.IE55 = 5.5 <= acme.IE && acme.IE < 6;
\r
105 acme.IE5x = acme.IE5 || acme.IE55;
\r
106 acme.IE6 = 6 <= acme.IE && acme.IE < 7;
\r
107 acme.IE7 = 7 <= acme.IE && acme.IE < 8;
\r
108 acme.IE8 = 8 <= acme.IE && acme.IE < 9;
\r
109 acme.IE9 = 9 <= acme.IE && acme.IE < 10;
\r
110 acme.MacIE = dua.indexOf( 'Mac_PowerPC' ) !== -1 || dua.indexOf( 'Mac_PPC' ) !== -1 || dua.indexOf( 'Mac_68K' ) !== -1;
\r
111 acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || acme.WinCE;
\r
112 acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;
\r
113 console.log( '>> IE : ' + acme.IE + ' ActiveX : ' + acme.ActiveX );
\r
114 // TODO XBox360, XBox1, Modern or Desktop, Standalone
\r
118 // http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html
\r
119 if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){
\r
120 acme.NetFront = parseFloat( dua.substr( i + 9 ) ) || 0;
\r
121 console.log( '>> NetFront : ' + acme.NetFront );
\r
125 if( acme.Linux && tv === 2 && dua.indexOf( 'Sony\/COM2\/' ) !== -1 ){
\r
126 acme.NetFront = 3.4;
\r
127 console.log( '>> NetFront : ' + acme.NetFront );
\r
131 // http://www.useragentstring.com/pages/Playstation%203/
\r
132 // Mozilla/5.0 (PLAYSTATION 3; 3.55)
\r
133 // Mozilla/4.0 (PS3 (PlayStation 3); 1.00)
\r
134 if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){
\r
135 acme.PS3 = parseFloat( dua.substr( i + 15 ) ) || 0;
\r
136 console.log( '>> PS3 : ' + acme.PS3 );
\r
140 // http://www.useragentstring.com/pages/iCab/
\r
141 // iCab/3.0.2 (Macintosh; U; PPC Mac OS X)
\r
142 // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3
\r
143 if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){
\r
144 acme.iCab = parseFloat( dua.substr( i + 5 ) ) || 0;
\r
145 console.log( '>> iCab : ' + acme.iCab );
\r
149 if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){
\r
150 v = dua.substr( i + 3 ).split( '.' );
\r
151 acme.Gecko = parseFloat( v[ 0 ] ) || 0 +
\r
152 ( parseFloat( v[ 1 ] ) || 0 ) / 10 +
\r
153 ( parseFloat( v[ 2 ] ) || 0 ) / 100;
\r
155 acme.GeckoMajor = parseFloat( v[ 0 ] ) || 0;
\r
156 acme.GeckoMinor = parseFloat( v[ 1 ] ) || 0;
\r
157 acme.GeckoPatch = parseFloat( v[ 2 ] ) || 0;
\r
160 // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0
\r
161 if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){
\r
162 acme.Fennec = parseFloat( dua.substr( i + 7 ) );
\r
163 console.log( '>> Fennec : ' + acme.Fennec + ', Gecko : ' + acme.Gecko );
\r
169 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3
\r
170 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){
\r
171 acme.NN = parseFloat( dua.substr( i + 10 ) ) || 6;
\r
173 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
176 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)
\r
177 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3
\r
178 if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){
\r
179 acme.NN = parseFloat( dua.substr( i + 9 ) ) || 7;
\r
180 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
183 //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
184 if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){
\r
185 acme.NN = parseFloat( dua.substr( i + 10 ) ) || 9;
\r
186 console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );
\r
190 console.log( '>> Gecko : ' + acme.Gecko );
\r
194 if( window.chrome ){
\r
196 console.log( '>>Blink : ' + acme.Blink );
\r
199 if( dav.indexOf( 'Konqueror' ) !== -1 ){
\r
201 console.log( '>>Khtml : ' + acme.Khtml );
\r
204 if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){
\r
205 acme.AndroidBrowser = i = parseFloat( dua.substr( i + 8 ) ) || 0;
\r
206 acme.AndroidBrowser1 = 1 <= i && i < 2;
\r
207 acme.AndroidBrowser2 = 2 <= i && i < 3;
\r
208 acme.AndroidBrowser3 = 3 <= i && i < 4;
\r
209 acme.AndroidBrowser4 = 4 <= i && i < 5;
\r
210 acme.AndroidBrowser5 = 5 <= i && i < 6;
\r
211 console.log( '>> AndroidBrowser : ' + acme.Android );
\r
213 if( i = parseFloat(dua.split('WebKit\/')[1]) ){
\r
216 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;
\r
218 // TODO webkit Opera
\r
220 console.log( '>>Webkit : ' + acme.WebKit );
\r
222 if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){
\r
223 if( dav.indexOf( 'Version/' ) !== -1 ){
\r
224 acme.Safari = parseFloat( dav.split('Version/')[1] );
\r
259 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );
\r
262 //http://www.useragentstring.com/pages/Iris/
\r
263 if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;
\r
265 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
266 dua.indexOf( 'Kobo' ) !== -1 ||
\r
267 // 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
268 dua.indexOf( 'Kindle' ) !== -1 ||
\r
269 // 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
270 dua.indexOf( 'EBRD' ) !== -1
\r
271 ) acme.EInk = true;
\r
279 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );
\r
282 * http://d.hatena.ne.jp/t-uchima/20051003/p1
\r
283 * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。
\r
285 if( X_UA.IE4 && X_UA.IE < 5 ){ // ie4 & iemobi4 & macie4.x
\r
286 X_UA_DOM.IE4 = true;
\r
287 X_UA_EVENT.IE4 = true;
\r
290 X_UA_DOM.W3C = true;
\r
291 X_UA_EVENT.IE = true;
\r
293 if( document.getElementById ){
\r
294 X_UA_DOM.W3C = true;
\r
295 if( document.addEventListener ){
\r
296 X_UA_EVENT.W3C = true;
\r
298 if( document.attachEvent ){
\r
299 X_UA_EVENT.IE = true;
\r
301 X_UA_EVENT.DOM0 = true;
\r
304 if( document.layers ){
\r
310 if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;
\r
311 if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH = true;
\r
313 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );
\r
315 // Safari 3.1 未満は開発コンソールがない!
\r
316 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html
\r
318 if( X_UA.Safari && X_UA.WebKit < 525.13 ){
\r
319 window.onerror = function( x, y, z ){
\r
320 var n = String.fromCharCode( 10 );
\r
321 alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');
\r
326 // ------------------------------------------------------------------------- //
\r
327 // --- interface ----------------------------------------------------------- //
\r
328 // ------------------------------------------------------------------------- //
\r
333 if( X_UA.IE < 7 ){ // error @ NN7.2
\r
334 // bonus: hotfix for IE6 SP1 (bug KB823727)
\r
335 // multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,
\r
336 X_UA.IE4 || X_UA.MacIE ?
\r
337 document.execCommand && document.execCommand( 'BackgroundImageCache', false, true ) :
\r
339 X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );
\r
342 X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );
\r