OSDN Git Service

fix XNode.text & X.Audio.Sprite & parse json of X.Net.XHR.
[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                 sys  = n.platform,\r
11                 tridentToVer, i, j, v;\r
12                 \r
13         console.log( ' userAgent  : ' + dua );\r
14         console.log( '-' );\r
15         console.log( ' appVersion : ' + dav );\r
16         console.log( '-' );\r
17         console.log( ' platform   : ' + sys );\r
18         console.log( '-' );\r
19         \r
20         // TODO 3DS, DSi, WiiU\r
21         \r
22         if( sys.indexOf( 'iP' ) === 0 ){\r
23 \r
24                 v = dua.split( 'OS ' )[ 1 ].split( '_' );\r
25                 i = window.devicePixelRatio === 1;\r
26                 \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
30 \r
31                 acme.iOS = acme.iOSMajor + acme.iOSMinor / 10;\r
32 \r
33                 if( screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height ){\r
34                         v = true; // 4:3 model\r
35                 };\r
36                 \r
37                 if( sys === 'iPhone' ){\r
38                         acme.iPhone = true;\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
42                 };\r
43                 if( sys === 'iPad' ){\r
44                         acme.iPad   = true;\r
45                         if( i ) acme.iPod_2Mini1 = true;\r
46                 };\r
47                 if( sys === 'iPod' ){\r
48                         acme.iPod   = true;\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
52                 };\r
53                 \r
54                 console.log( '>> iOS : ' + acme.iOS );\r
55         } else\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
59         } else\r
60         if( sys.indexOf( 'Win' ) + 1 ){\r
61                 console.log( 'Win' );\r
62                 acme.Windows = true;\r
63                 switch( sys ){\r
64                         case 'Win16' :\r
65                         case 'Win32' :\r
66                         case 'Win64' :\r
67                         case 'WinCE' :\r
68                                 acme[ sys ] = true;\r
69                 };\r
70         } else\r
71         if( sys.indexOf( 'Mac' ) + 1 ){\r
72                 console.log( 'Mac' );\r
73                 acme.Mac = true;\r
74                 switch( sys ){\r
75                         case 'MacPowerPC' :\r
76                                 acme.MacPPC = true;\r
77                                 break;\r
78                         case 'MacPPC' :\r
79                         case 'Mac68K' :\r
80                         case 'MacIntel' :\r
81                                 acme[ sys] = true;\r
82                 };\r
83         } else\r
84         if( sys.indexOf( 'Linux' ) + 1 ){\r
85                 console.log( 'Linux' );\r
86                 acme.Linux = true;\r
87                 \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
91                 };\r
92         };\r
93 \r
94 /*\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
101  */\r
102         \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
109                         tv );\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
120                 return acme;\r
121         };\r
122         \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
147                 return acme;\r
148         };\r
149         \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
154                 return acme;\r
155         };\r
156         \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
160                 return acme;\r
161         };\r
162         \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
169                 return acme;\r
170         };\r
171         \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
178                 return acme;\r
179         };\r
180         \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
186                 \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
190                 \r
191                 //Fennec\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
196                         return acme;\r
197                 };\r
198                 //Firefox\r
199                 \r
200                 //Netscape\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
204                         acme.NN6 = true;\r
205                         console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
206                         return acme;\r
207                 } else\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
213                         return acme;\r
214                 } else\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
219                         return acme;\r
220                 };\r
221                 \r
222                 console.log( '>> Gecko : ' + acme.Gecko );\r
223         };\r
224         \r
225         // TODO Blink\r
226         if( window.chrome ){\r
227                 acme.Blink = tv;\r
228                 console.log( '>>Blink : ' + acme.Blink );\r
229                 \r
230         } else\r
231         if( dav.indexOf( 'Konqueror' ) !== -1 ){\r
232                 acme.Khtml = tv;\r
233                 console.log( '>>Khtml : ' + acme.Khtml );\r
234                 \r
235         } else\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
244         } else\r
245         if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
246                 acme.WebKit = i;\r
247                 \r
248                 acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;\r
249                 \r
250                 // TODO webkit Opera\r
251         \r
252                 console.log( '>>Webkit : ' + acme.WebKit );\r
253         \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
257                         } else {\r
258                                 if( i < 73 ){\r
259                                         acme.Safari = 0.8;\r
260                                 } else\r
261                                 if( i < 85 ){\r
262                                         acme.Safari = 0.9;\r
263                                 } else\r
264                                 if( i < 100 ){\r
265                                         acme.Safari = 1;\r
266                                 } else\r
267                                 if( i < 125 ){\r
268                                         acme.Safari = 1.1;\r
269                                 } else\r
270                                 if( i < 312 ){\r
271                                         acme.Safari = 1.2;\r
272                                 } else\r
273                                 if( i < 412 ){\r
274                                         acme.Safari = 1.3;\r
275                                 } else\r
276                                 if( i <= 419.3 ){\r
277                                         acme.Safari = 2;\r
278                                 } else\r
279                                 if( i <= 525.13 ){\r
280                                         acme.Safari = 3;\r
281                                 } else\r
282                                 if( i <= 525.25 ){\r
283                                         acme.Safari = 3.1;\r
284                                 } else\r
285                                 if( i <= 528.16 ){\r
286                                         acme.Safari = 3.2;\r
287                                 };\r
288                         };\r
289                 };              \r
290                 \r
291                 console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
292         };\r
293         \r
294         //http://www.useragentstring.com/pages/Iris/\r
295         if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) acme.Iris = true;\r
296         \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
304         \r
305         return acme;\r
306 })( navigator ),\r
307 \r
308 X_UA_DOM   = {},\r
309 X_UA_EVENT = {},\r
310 X_UA_HID   = {};\r
311 //X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );\r
312 \r
313 /*\r
314  * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
315  * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
316  */\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
320 } else\r
321 if( X_UA.MacIE ){\r
322         X_UA_DOM.W3C  = true;\r
323         X_UA_EVENT.IE = true;\r
324 } else\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
329         } else\r
330         if( document.attachEvent ){\r
331                 X_UA_EVENT.IE = true;\r
332         } else {\r
333                 X_UA_EVENT.DOM0 = true;\r
334         };\r
335 } else\r
336 if( document.layers ){\r
337         \r
338 } else {\r
339         \r
340 };\r
341 \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
344 \r
345 //alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
346 \r
347 // Safari 3.1 未満は開発コンソールがない!\r
348 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
349 /*\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
354             return true;\r
355         };\r
356 };*/\r
357 \r
358 // ------------------------------------------------------------------------- //\r
359 // --- interface ----------------------------------------------------------- //\r
360 // ------------------------------------------------------------------------- //\r
361 X.UA = X_UA;\r
362 \r
363 \r
364 \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
370                 (function(){\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
372                 })();\r
373         \r
374         X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );\r
375 };\r