OSDN Git Service

Version 0.6.115, fix X.Class & X.Node.Selector for Opera Mobile 12, fix X.Audio.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 02_XUA.js
1 \r
2 // ------------------------------------------------------------------------- //\r
3 // ------------ local variables -------------------------------------------- //\r
4 // ------------------------------------------------------------------------- //\r
5 var X_UA = (function( n, undefined ){\r
6         var acme = {},\r
7                 dua  = n.userAgent,\r
8                 dav  = n.appVersion,\r
9                 tv   = parseFloat(dav),\r
10                 tridentToVer, i, j, v;\r
11                 \r
12         console.log( ' userAgent  : ' + dua );\r
13         console.log( '-' );\r
14         console.log( ' appVersion : ' + dav );\r
15         console.log( '-' );\r
16         console.log( ' platform   : ' + n.platform );\r
17         console.log( '-' );\r
18         \r
19         // TODO 3DS, DSi, WiiU\r
20         \r
21         if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){\r
22                 \r
23                 v = dua.split( 'OS ' )[ 1 ].split( '_' );\r
24                 \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
28                 \r
29                 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;\r
30                 \r
31                 console.log( '>> iOS : ' + acme.iOS );\r
32         } else\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
36         } else\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
44         } else\r
45         if( n.platform.indexOf( 'Mac' ) + 1 ){\r
46                 console.log( 'Mac' );\r
47                 acme.Mac = true;\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
51         } else\r
52         if( n.platform.indexOf( 'Linux' ) + 1 ){\r
53                 console.log( 'Linux' );\r
54                 acme.Linux = true;\r
55                 \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
59                 };\r
60         };\r
61 \r
62 /*\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
69  */\r
70         \r
71         if( window.opera ){\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
77                         tv );\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
88                 return acme;\r
89         };\r
90         \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
115                 return acme;\r
116         };\r
117         \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
122                 return acme;\r
123         };\r
124         \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
128                 return acme;\r
129         };\r
130         \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
137                 return acme;\r
138         };\r
139         \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
146                 return acme;\r
147         };\r
148         \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
154                 \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
158                 \r
159                 //Fennec\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
164                         return acme;\r
165                 };\r
166                 //Firefox\r
167                 \r
168                 //Netscape\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
172                         acme.NN6 = true;\r
173                         console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
174                         return acme;\r
175                 } else\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
181                         return acme;\r
182                 } else\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
187                         return acme;\r
188                 };\r
189                 \r
190                 console.log( '>> Gecko : ' + acme.Gecko );\r
191         };\r
192         \r
193         // TODO Blink\r
194         if( window.chrome ){\r
195                 acme.Blink = tv;\r
196                 console.log( '>>Blink : ' + acme.Blink );\r
197                 \r
198         } else\r
199         if( dav.indexOf( 'Konqueror' ) !== -1 ){\r
200                 acme.Khtml = tv;\r
201                 console.log( '>>Khtml : ' + acme.Khtml );\r
202                 \r
203         } else\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
212         } else\r
213         if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
214                 acme.WebKit = i;\r
215                 \r
216                 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;\r
217                 \r
218                 // TODO webkit Opera\r
219         \r
220                 console.log( '>>Webkit : ' + acme.WebKit );\r
221         \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
225                         } else {\r
226                                 if( i < 73 ){\r
227                                         acme.Safari = 0.8;\r
228                                 } else\r
229                                 if( i < 85 ){\r
230                                         acme.Safari = 0.9;\r
231                                 } else\r
232                                 if( i < 100 ){\r
233                                         acme.Safari = 1;\r
234                                 } else\r
235                                 if( i < 125 ){\r
236                                         acme.Safari = 1.1;\r
237                                 } else\r
238                                 if( i < 312 ){\r
239                                         acme.Safari = 1.2;\r
240                                 } else\r
241                                 if( i < 412 ){\r
242                                         acme.Safari = 1.3;\r
243                                 } else\r
244                                 if( i <= 419.3 ){\r
245                                         acme.Safari = 2;\r
246                                 } else\r
247                                 if( i <= 525.13 ){\r
248                                         acme.Safari = 3;\r
249                                 } else\r
250                                 if( i <= 525.25 ){\r
251                                         acme.Safari = 3.1;\r
252                                 } else\r
253                                 if( i <= 528.16 ){\r
254                                         acme.Safari = 3.2;\r
255                                 };\r
256                         };\r
257                 };              \r
258                 \r
259                 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
260         };\r
261         \r
262         //http://www.useragentstring.com/pages/Iris/\r
263         if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;\r
264         \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
272         \r
273         return acme;\r
274 })( navigator ),\r
275 \r
276 X_UA_DOM   = {},\r
277 X_UA_EVENT = {},\r
278 X_UA_HID   = {};\r
279 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );\r
280 \r
281 /*\r
282  * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
283  * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
284  */\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
288 } else\r
289 if( X_UA.MacIE ){\r
290         X_UA_DOM.W3C  = true;\r
291         X_UA_EVENT.IE = true;\r
292 } else\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
297         } else\r
298         if( document.attachEvent ){\r
299                 X_UA_EVENT.IE = true;\r
300         } else {\r
301                 X_UA_EVENT.DOM0 = true;\r
302         };\r
303 } else\r
304 if( document.layers ){\r
305         \r
306 } else {\r
307         \r
308 };\r
309 \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
312 \r
313 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
314 \r
315 // Safari 3.1 未満は開発コンソールがない!\r
316 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
317 /*\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
322             return true;\r
323         };\r
324 };*/\r
325 \r
326 // ------------------------------------------------------------------------- //\r
327 // --- interface ----------------------------------------------------------- //\r
328 // ------------------------------------------------------------------------- //\r
329 X.UA = X_UA;\r
330 \r
331 \r
332 \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
338                 (function(){\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
340                 })();\r
341         \r
342         X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );\r
343 };\r