middleman-wizard-template 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. checksums.yaml +7 -0
  2. data/lib/middleman-wizard-template/template/source/index.html.erb +1 -89
  3. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Matrix.js +449 -0
  4. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoader.js +395 -0
  5. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderImage.js +96 -0
  6. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderSwiffy.js +68 -0
  7. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/RouteRecognizer.js +506 -0
  8. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Slides.js +846 -0
  9. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Transform.js +312 -0
  10. data/lib/middleman-wizard-template/template/source/javascripts/_lib/{Tween.js → ww/Tween.js} +26 -11
  11. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/base.js +8 -0
  12. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/raf.js +131 -0
  13. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/statemachine.js +1024 -0
  14. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/useragent.js +1244 -0
  15. data/lib/middleman-wizard-template/template/source/javascripts/_lib/{util.js → ww/util.js} +48 -50
  16. data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/viewport.js +89 -0
  17. data/lib/middleman-wizard-template/template/source/javascripts/{app.js → site.js} +5 -5
  18. data/lib/middleman-wizard-template/template/source/layouts/layout.erb +85 -0
  19. data/lib/middleman-wizard-template/template/source/stylesheets/default.css +2 -1
  20. data/lib/middleman-wizard-template/template/source/stylesheets/site.css.scss +11 -3
  21. data/lib/middleman-wizard-template/version.rb +1 -1
  22. metadata +23 -23
  23. data/lib/middleman-wizard-template/template/source/javascripts/_lib/Transform.js +0 -401
  24. data/lib/middleman-wizard-template/template/source/javascripts/_lib/raf.js +0 -26
  25. data/lib/middleman-wizard-template/template/source/javascripts/_lib/router.js +0 -679
@@ -0,0 +1,1244 @@
1
+ // Copyright 2012 Google Inc. All Rights Reserved.
2
+
3
+ /**
4
+ * @fileoverview Returns a string reporting the user's browser, OS and versions
5
+ * of both. Can also be extended to return platform data.
6
+ * @author brian.hefter@weareinstrument.com (Brian Hefter)
7
+ */
8
+
9
+ goog.provide('ww.userAgent');
10
+
11
+
12
+ // Creates a multi-dimensional array full of browser, os, and device regex data.
13
+ var browserData = {
14
+ 'userAgentParsers': [
15
+ {
16
+ 'regex': '^(Opera)/(\\d+)\\.(\\d+) \\(Nintendo Wii',
17
+ 'familyReplacement': 'Wii'
18
+ },
19
+ {
20
+ 'regex': '(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)'
21
+ },
22
+ {
23
+ 'regex': '(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
24
+ 'familyReplacement': 'Pale Moon (Firefox Variant)'
25
+ },
26
+ {
27
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)',
28
+ 'familyReplacement': 'Firefox Mobile'
29
+ },
30
+ {
31
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)(pre)',
32
+ 'familyReplacement': 'Firefox Mobile'
33
+ },
34
+ {
35
+ 'regex': '(Fennec)/(\\d+)\\.(\\d+)',
36
+ 'familyReplacement': 'Firefox Mobile'
37
+ },
38
+ {
39
+ 'regex': 'Mobile.*(Firefox)/(\\d+)\\.(\\d+)',
40
+ 'familyReplacement': 'Firefox Mobile'
41
+ },
42
+ {
43
+ 'regex': '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)',
44
+ 'familyReplacement': 'Firefox ($1)'
45
+ },
46
+ {
47
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
48
+ 'familyReplacement': 'Firefox Alpha'
49
+ },
50
+ {
51
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
52
+ 'familyReplacement': 'Firefox Beta'
53
+ },
54
+ {
55
+ 'regex': '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
56
+ 'familyReplacement': 'Firefox Alpha'
57
+ },
58
+ {
59
+ 'regex': '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
60
+ 'familyReplacement': 'Firefox Beta'
61
+ },
62
+ {
63
+ 'regex': '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?',
64
+ 'familyReplacement': 'Firefox ($1)'
65
+ },
66
+ {
67
+ 'regex': '(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)',
68
+ 'familyReplacement': 'MicroB'
69
+ },
70
+ {
71
+ 'regex': '(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?'
72
+ },
73
+ {
74
+ 'regex': '(Flock)/(\\d+)\\.(\\d+)(b\\d+?)'
75
+ },
76
+ {
77
+ 'regex': '(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)'
78
+ },
79
+ {
80
+ 'regex': '(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)',
81
+ 'familyReplacement': 'Netscape'
82
+ },
83
+ {
84
+ 'regex': '(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)',
85
+ 'familyReplacement': 'Netscape'
86
+ },
87
+ {
88
+ 'regex': '(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)',
89
+ 'familyReplacement': 'Netscape'
90
+ },
91
+ {
92
+ 'regex': '(MyIBrow)/(\\d+)\\.(\\d+)',
93
+ 'familyReplacement': 'My Internet Browser'
94
+ },
95
+ {
96
+ 'regex': '(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
97
+ },
98
+ {
99
+ 'regex': '(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)',
100
+ 'familyReplacement': 'Opera Mobile'
101
+ },
102
+ {
103
+ 'regex': 'Opera Mobi',
104
+ 'familyReplacement': 'Opera Mobile'
105
+ },
106
+ {
107
+ 'regex': '(Opera Mini)/(\\d+)\\.(\\d+)'
108
+ },
109
+ {
110
+ 'regex': '(Opera Mini)/att/(\\d+)\\.(\\d+)'
111
+ },
112
+ {
113
+ 'regex': '(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
114
+ },
115
+ {
116
+ 'regex': '(webOSBrowser)/(\\d+)\\.(\\d+)'
117
+ },
118
+ {
119
+ 'regex': '(webOS)/(\\d+)\\.(\\d+)',
120
+ 'familyReplacement': 'webOSBrowser'
121
+ },
122
+ {
123
+ 'regex': '(wOSBrowser).+TouchPad/(\\d+)\\.(\\d+)',
124
+ 'familyReplacement': 'webOS TouchPad'
125
+ },
126
+ {
127
+ 'regex': '(luakit)',
128
+ 'familyReplacement': 'LuaKit'
129
+ },
130
+ {
131
+ 'regex': '(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)'
132
+ },
133
+ {
134
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)',
135
+ 'familyReplacement': 'Swiftfox'
136
+ },
137
+ {
138
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)',
139
+ 'familyReplacement': 'Swiftfox'
140
+ },
141
+ {
142
+ 'regex': 'rekonq',
143
+ 'familyReplacement': 'Rekonq'
144
+ },
145
+ {
146
+ 'regex': '(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
147
+ 'familyReplacement': 'Conkeror'
148
+ },
149
+ {
150
+ 'regex': '(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)',
151
+ 'familyReplacement': 'Konqueror'
152
+ },
153
+ {
154
+ 'regex': '(WeTab)-Browser'
155
+ },
156
+ {
157
+ 'regex': '(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)',
158
+ 'familyReplacement': 'Comodo Dragon'
159
+ },
160
+ {
161
+ 'regex': '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
162
+ },
163
+ {
164
+ 'regex': '(Kindle)/(\\d+)\\.(\\d+)'
165
+ },
166
+ {
167
+ 'regex': '(Symphony) (\\d+).(\\d+)'
168
+ },
169
+ {
170
+ 'regex': '(Minimo)'
171
+ },
172
+ {
173
+ 'regex': '(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
174
+ 'familyReplacement': 'Chrome Mobile'
175
+ },
176
+ {
177
+ 'regex': '(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
178
+ 'familyReplacement': 'Chrome Mobile iOS'
179
+ },
180
+ {
181
+ 'regex': '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile',
182
+ 'familyReplacement': 'Chrome Mobile'
183
+ },
184
+ {
185
+ 'regex': '(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)',
186
+ 'familyReplacement': 'Chrome Frame'
187
+ },
188
+ {
189
+ 'regex': '(UC Browser)(\\d+)\\.(\\d+)\\.(\\d+)'
190
+ },
191
+ {
192
+ 'regex': '(SLP Browser)/(\\d+)\\.(\\d+)',
193
+ 'familyReplacement': 'Tizen Browser'
194
+ },
195
+ {
196
+ 'regex': '(Epiphany)/(\\d+)\\.(\\d+).(\\d+)'
197
+ },
198
+ {
199
+ 'regex': '(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)',
200
+ 'familyReplacement': 'Sogou Explorer'
201
+ },
202
+ {
203
+ 'regex': '(FlyFlow)/(\\d+)\\.(\\d+)',
204
+ 'familyReplacement': 'Baidu Explorer'
205
+ },
206
+ {
207
+ 'regex': '(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)',
208
+ 'familyReplacement': 'PingdomBot'
209
+ },
210
+ {
211
+ 'regex': '(facebookexternalhit)/(\\d+)\\.(\\d+)',
212
+ 'familyReplacement': 'FacebookBot'
213
+ },
214
+ {
215
+ 'regex': '(Twitterbot)/(\\d+)\\.(\\d+)',
216
+ 'familyReplacement': 'TwitterBot'
217
+ },
218
+ {
219
+ 'regex': '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\\d+)\\.(\\d+)\\.(\\d+)'
220
+ },
221
+ {
222
+ 'regex': '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser)/(\\d+)\\.(\\d+)'
223
+ },
224
+ {
225
+ 'regex': '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)'
226
+ },
227
+ {
228
+ 'regex': '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\\d+)\\.(\\d+)\\.?(\\d+)?'
229
+ },
230
+ {
231
+ 'regex': '(Android) Donut',
232
+ 'v2Replacement': '2',
233
+ 'v1Replacement': '1'
234
+ },
235
+ {
236
+ 'regex': '(Android) Eclair',
237
+ 'v2Replacement': '1',
238
+ 'v1Replacement': '2'
239
+ },
240
+ {
241
+ 'regex': '(Android) Froyo',
242
+ 'v2Replacement': '2',
243
+ 'v1Replacement': '2'
244
+ },
245
+ {
246
+ 'regex': '(Android) Gingerbread',
247
+ 'v2Replacement': '3',
248
+ 'v1Replacement': '2'
249
+ },
250
+ {
251
+ 'regex': '(Android) Honeycomb',
252
+ 'v1Replacement': '3'
253
+ },
254
+ {
255
+ 'regex': '(IEMobile)[ /](\\d+)\\.(\\d+)',
256
+ 'familyReplacement': 'IE Mobile'
257
+ },
258
+ {
259
+ 'regex': '(MSIE) (\\d+)\\.(\\d+).*XBLWP7',
260
+ 'familyReplacement': 'IE Large Screen'
261
+ },
262
+ {
263
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)'
264
+ },
265
+ {
266
+ 'regex': '(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?'
267
+ },
268
+ {
269
+ 'regex': '(Obigo)InternetBrowser'
270
+ },
271
+ {
272
+ 'regex': '(Obigo)\\-Browser'
273
+ },
274
+ {
275
+ 'regex': '(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?'
276
+ },
277
+ {
278
+ 'regex': '(MAXTHON|Maxthon) (\\d+)\\.(\\d+)',
279
+ 'familyReplacement': 'Maxthon'
280
+ },
281
+ {
282
+ 'regex': '(Maxthon|MyIE2|Uzbl|Shiira)',
283
+ 'v1Replacement': '0'
284
+ },
285
+ {
286
+ 'regex': '(PLAYSTATION) (\\d+)',
287
+ 'familyReplacement': 'PlayStation'
288
+ },
289
+ {
290
+ 'regex': '(PlayStation Portable)[^\\d]+(\\d+).(\\d+)'
291
+ },
292
+ {
293
+ 'regex': '(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)'
294
+ },
295
+ {
296
+ 'regex': '(POLARIS)/(\\d+)\\.(\\d+)',
297
+ 'familyReplacement': 'Polaris'
298
+ },
299
+ {
300
+ 'regex': '(Embider)/(\\d+)\\.(\\d+)',
301
+ 'familyReplacement': 'Polaris'
302
+ },
303
+ {
304
+ 'regex': '(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)',
305
+ 'familyReplacement': 'Bon Echo'
306
+ },
307
+ {
308
+ 'regex': '(iPod).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
309
+ 'familyReplacement': 'Mobile Safari'
310
+ },
311
+ {
312
+ 'regex': '(iPod).*Version/(\\d+)\\.(\\d+)',
313
+ 'familyReplacement': 'Mobile Safari'
314
+ },
315
+ {
316
+ 'regex': '(iPhone).*Version/(\\d+)\\.(\\d+)\\.(\\d+)',
317
+ 'familyReplacement': 'Mobile Safari'
318
+ },
319
+ {
320
+ 'regex': '(iPhone).*Version/(\\d+)\\.(\\d+)',
321
+ 'familyReplacement': 'Mobile Safari'
322
+ },
323
+ {
324
+ 'regex': '(iPad).*Version/(\\d+)\\.(\\d+)\\.(\\d+)',
325
+ 'familyReplacement': 'Mobile Safari'
326
+ },
327
+ {
328
+ 'regex': '(iPad).*Version/(\\d+)\\.(\\d+)',
329
+ 'familyReplacement': 'Mobile Safari'
330
+ },
331
+ {
332
+ 'regex': '(iPod|iPhone|iPad);.*CPU.*OS (\\d+)(?:_\\d+)?_(\\d+).*Mobile',
333
+ 'familyReplacement': 'Mobile Safari'
334
+ },
335
+ {
336
+ 'regex': '(iPod|iPhone|iPad)',
337
+ 'familyReplacement': 'Mobile Safari'
338
+ },
339
+ {
340
+ 'regex': '(AvantGo) (\\d+).(\\d+)'
341
+ },
342
+ {
343
+ 'regex': '(Avant)',
344
+ 'v1Replacement': '1'
345
+ },
346
+ {
347
+ 'regex': '^(Nokia)',
348
+ 'familyReplacement': 'Nokia Services (WAP) Browser'
349
+ },
350
+ {
351
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)'
352
+ },
353
+ {
354
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)'
355
+ },
356
+ {
357
+ 'regex': '(NokiaBrowser)/(\\d+)\\.(\\d+)'
358
+ },
359
+ {
360
+ 'regex': '(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)',
361
+ 'familyReplacement': 'NokiaBrowser'
362
+ },
363
+ {
364
+ 'regex': '(Series60)/5\\.0',
365
+ 'v2Replacement': '0',
366
+ 'v1Replacement': '7',
367
+ 'familyReplacement': 'NokiaBrowser'
368
+ },
369
+ {
370
+ 'regex': '(Series60)/(\\d+)\\.(\\d+)',
371
+ 'familyReplacement': 'Nokia OSS Browser'
372
+ },
373
+ {
374
+ 'regex': '(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
375
+ 'familyReplacement': 'Nokia Series 40 Ovi Browser'
376
+ },
377
+ {
378
+ 'regex': '(Nokia)[EN]?(\\d+)'
379
+ },
380
+ {
381
+ 'regex': '(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)',
382
+ 'familyReplacement': 'Blackberry WebKit'
383
+ },
384
+ {
385
+ 'regex': '(Black[bB]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
386
+ 'familyReplacement': 'Blackberry WebKit'
387
+ },
388
+ {
389
+ 'regex': '(Black[bB]erry)\\s?(\\d+)',
390
+ 'familyReplacement': 'Blackberry'
391
+ },
392
+ {
393
+ 'regex': '(OmniWeb)/v(\\d+)\\.(\\d+)'
394
+ },
395
+ {
396
+ 'regex': '(Blazer)/(\\d+)\\.(\\d+)',
397
+ 'familyReplacement': 'Palm Blazer'
398
+ },
399
+ {
400
+ 'regex': '(Pre)/(\\d+)\\.(\\d+)',
401
+ 'familyReplacement': 'Palm Pre'
402
+ },
403
+ {
404
+ 'regex': '(Links) \\((\\d+)\\.(\\d+)'
405
+ },
406
+ {
407
+ 'regex': '(QtWeb) Internet Browser/(\\d+)\\.(\\d+)'
408
+ },
409
+ {
410
+ 'regex': '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?'
411
+ },
412
+ {
413
+ 'regex': '(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari',
414
+ 'familyReplacement': 'WebKit Nightly'
415
+ },
416
+ {
417
+ 'regex': '(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/',
418
+ 'familyReplacement': 'Safari'
419
+ },
420
+ {
421
+ 'regex': '(Safari)/\\d+'
422
+ },
423
+ {
424
+ 'regex': '(OLPC)/Update(\\d+)\\.(\\d+)'
425
+ },
426
+ {
427
+ 'regex': '(OLPC)/Update()\\.(\\d+)',
428
+ 'v1Replacement': '0'
429
+ },
430
+ {
431
+ 'regex': '(SEMC\\-Browser)/(\\d+)\\.(\\d+)'
432
+ },
433
+ {
434
+ 'regex': '(Teleca)',
435
+ 'familyReplacement': 'Teleca Browser'
436
+ },
437
+ {
438
+ 'regex': '(MSIE) (\\d+)\\.(\\d+)',
439
+ 'familyReplacement': 'IE'
440
+ },
441
+ {
442
+ 'regex': '(Nintendo 3DS).* Version/(\\d+)\\.(\\d+)(?:\\.(\\w+))'
443
+ }
444
+ ],
445
+ 'osParsers': [
446
+ {
447
+ 'regex': '(Android) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?'
448
+ },
449
+ {
450
+ 'regex': '(Android)\\-(\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?'
451
+ },
452
+ {
453
+ 'regex': '(Android) Donut',
454
+ 'osV2Replacement': '2',
455
+ 'osV1Replacement': '1'
456
+ },
457
+ {
458
+ 'regex': '(Android) Eclair',
459
+ 'osV2Replacement': '1',
460
+ 'osV1Replacement': '2'
461
+ },
462
+ {
463
+ 'regex': '(Android) Froyo',
464
+ 'osV2Replacement': '2',
465
+ 'osV1Replacement': '2'
466
+ },
467
+ {
468
+ 'regex': '(Android) Gingerbread',
469
+ 'osV2Replacement': '3',
470
+ 'osV1Replacement': '2'
471
+ },
472
+ {
473
+ 'regex': '(Android) Honeycomb',
474
+ 'osV1Replacement': '3'
475
+ },
476
+ {
477
+ 'regex': '(Windows Phone 6\\.5)'
478
+ },
479
+ {
480
+ 'regex': '(Windows (?:NT 5\\.2|NT 5\\.1))',
481
+ 'osReplacement': 'Windows XP'
482
+ },
483
+ {
484
+ 'regex': '(XBLWP7)',
485
+ 'osReplacement': 'Windows Phone OS'
486
+ },
487
+ {
488
+ 'regex': '(Windows NT 6\\.1)',
489
+ 'osReplacement': 'Windows 7'
490
+ },
491
+ {
492
+ 'regex': '(Windows NT 6\\.0)',
493
+ 'osReplacement': 'Windows Vista'
494
+ },
495
+ {
496
+ 'regex': '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000)'
497
+ },
498
+ {
499
+ 'regex': '(Windows NT 6\\.2)',
500
+ 'osReplacement': 'Windows 8'
501
+ },
502
+ {
503
+ 'regex': '(Windows NT 5\\.0)',
504
+ 'osReplacement': 'Windows 2000'
505
+ },
506
+ {
507
+ 'regex': '(Windows Phone OS) (\\d+)\\.(\\d+)'
508
+ },
509
+ {
510
+ 'regex': '(Windows ?Mobile)',
511
+ 'osReplacement': 'Windows Mobile'
512
+ },
513
+ {
514
+ 'regex': '(WinNT4.0)',
515
+ 'osReplacement': 'Windows NT 4.0'
516
+ },
517
+ {
518
+ 'regex': '(Win98)',
519
+ 'osReplacement': 'Windows 98'
520
+ },
521
+ {
522
+ 'regex': '(Tizen)/(\\d+)\\.(\\d+)'
523
+ },
524
+ {
525
+ 'regex': '(Mac OS X) (\\d+)[_.](\\d+)(?:[_.](\\d+))?'
526
+ },
527
+ {
528
+ 'regex': '(?:PPC|Intel) (Mac OS X)'
529
+ },
530
+ {
531
+ 'regex': '(CPU OS|iPhone OS) (\\d+)_(\\d+)(?:_(\\d+))?',
532
+ 'osReplacement': 'iOS'
533
+ },
534
+ {
535
+ 'regex': '(iPhone|iPad|iPod); Opera',
536
+ 'osReplacement': 'iOS'
537
+ },
538
+ {
539
+ 'regex': '(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)',
540
+ 'osReplacement': 'iOS'
541
+ },
542
+ {
543
+ 'regex': '(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?',
544
+ 'osReplacement': 'Chrome OS'
545
+ },
546
+ {
547
+ 'regex': '(Debian)-(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
548
+ },
549
+ {
550
+ 'regex': '(Linux Mint)(?:/(\\d+))?'
551
+ },
552
+ {
553
+ 'regex': '(Mandriva)(?: Linux)?/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?'
554
+ },
555
+ {
556
+ 'regex': '(Symbian[Oo][Ss])/(\\d+)\\.(\\d+)',
557
+ 'osReplacement': 'Symbian OS'
558
+ },
559
+ {
560
+ 'regex': '(Symbian/3).+NokiaBrowser/7\\.3',
561
+ 'osReplacement': 'Symbian^3 Anna'
562
+ },
563
+ {
564
+ 'regex': '(Symbian/3).+NokiaBrowser/7\\.4',
565
+ 'osReplacement': 'Symbian^3 Belle'
566
+ },
567
+ {
568
+ 'regex': '(Symbian/3)',
569
+ 'osReplacement': 'Symbian^3'
570
+ },
571
+ {
572
+ 'regex': '(Series 60|SymbOS|S60)',
573
+ 'osReplacement': 'Symbian OS'
574
+ },
575
+ {
576
+ 'regex': '(MeeGo)'
577
+ },
578
+ {
579
+ 'regex': 'Symbian [Oo][Ss]',
580
+ 'osReplacement': 'Symbian OS'
581
+ },
582
+ {
583
+ 'regex': '(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
584
+ 'osReplacement': 'BlackBerry OS'
585
+ },
586
+ {
587
+ 'regex': '(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
588
+ 'osReplacement': 'BlackBerry OS'
589
+ },
590
+ {
591
+ 'regex': '(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)',
592
+ 'osReplacement': 'BlackBerry Tablet OS'
593
+ },
594
+ {
595
+ 'regex': '(Play[Bb]ook)',
596
+ 'osReplacement': 'BlackBerry Tablet OS'
597
+ },
598
+ {
599
+ 'regex': '(Black[Bb]erry)',
600
+ 'osReplacement': 'Blackberry OS'
601
+ },
602
+ {
603
+ 'regex': '(webOS|hpwOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
604
+ 'osReplacement': 'webOS'
605
+ },
606
+ {
607
+ 'regex': '(SUSE|Fedora|Red Hat|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)'
608
+ },
609
+ {
610
+ 'regex': '(SUSE|Fedora|Red Hat|Puppy|PCLinuxOS|CentOS)/(\\d+)\\.(\\d+)\\.(\\d+)'
611
+ },
612
+ {
613
+ 'regex': '(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\\d+)\\.(\\d+)'
614
+ },
615
+ {
616
+ 'regex': '(PlayStation Vita) (\\d+)\\.(\\d+)'
617
+ },
618
+ {
619
+ 'regex': '(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)'
620
+ },
621
+ {
622
+ 'regex': '(Linux|BSD)'
623
+ }
624
+ ],
625
+ 'mobileOSFamilies': [
626
+ 'Windows Phone 6.5',
627
+ 'Windows CE',
628
+ 'Symbian OS'
629
+ ],
630
+ 'deviceParsers': [
631
+ {
632
+ 'regex': 'HTC ([A-Z][a-z0-9]+) Build',
633
+ 'deviceReplacement': 'HTC $1'
634
+ },
635
+ {
636
+ 'regex': 'HTC ([A-Z][a-z0-9 ]+) \\d+\\.\\d+\\.\\d+\\.\\d+',
637
+ 'deviceReplacement': 'HTC $1'
638
+ },
639
+ {
640
+ 'regex': 'HTC_Touch_([A-Za-z0-9]+)',
641
+ 'deviceReplacement': 'HTC Touch ($1)'
642
+ },
643
+ {
644
+ 'regex': 'USCCHTC(\\d+)',
645
+ 'deviceReplacement': 'HTC $1 (US Cellular)'
646
+ },
647
+ {
648
+ 'regex': 'Sprint APA(9292)',
649
+ 'deviceReplacement': 'HTC $1 (Sprint)'
650
+ },
651
+ {
652
+ 'regex': 'HTC ([A-Za-z0-9]+ [A-Z])',
653
+ 'deviceReplacement': 'HTC $1'
654
+ },
655
+ {
656
+ 'regex': 'HTC-([A-Za-z0-9]+)',
657
+ 'deviceReplacement': 'HTC $1'
658
+ },
659
+ {
660
+ 'regex': 'HTC_([A-Za-z0-9]+)',
661
+ 'deviceReplacement': 'HTC $1'
662
+ },
663
+ {
664
+ 'regex': 'HTC ([A-Za-z0-9]+)',
665
+ 'deviceReplacement': 'HTC $1'
666
+ },
667
+ {
668
+ 'regex': '(ADR[A-Za-z0-9]+)',
669
+ 'deviceReplacement': 'HTC $1'
670
+ },
671
+ {
672
+ 'regex': '(HTC)'
673
+ },
674
+ {
675
+ 'regex': '(SamsungSGHi560)',
676
+ 'deviceReplacement': 'Samsung SGHi560'
677
+ },
678
+ {
679
+ 'regex': 'SonyEricsson([A-Za-z0-9]+)/',
680
+ 'deviceReplacement': 'Ericsson $1'
681
+ },
682
+ {
683
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; WOWMobile (.+) Build'
684
+ },
685
+ {
686
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
687
+ },
688
+ {
689
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\-update1\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
690
+ },
691
+ {
692
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build'
693
+ },
694
+ {
695
+ 'regex': 'Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; (.+) Build'
696
+ },
697
+ {
698
+ 'regex': 'NokiaN([0-9]+)',
699
+ 'deviceReplacement': 'Nokia N$1'
700
+ },
701
+ {
702
+ 'regex': 'Nokia([A-Za-z0-9\\v-]+)',
703
+ 'deviceReplacement': 'Nokia $1'
704
+ },
705
+ {
706
+ 'regex': 'NOKIA ([A-Za-z0-9\\-]+)',
707
+ 'deviceReplacement': 'Nokia $1'
708
+ },
709
+ {
710
+ 'regex': 'Nokia ([A-Za-z0-9\\-]+)',
711
+ 'deviceReplacement': 'Nokia $1'
712
+ },
713
+ {
714
+ 'regex': 'Lumia ([A-Za-z0-9\\-]+)',
715
+ 'deviceReplacement': 'Lumia $1'
716
+ },
717
+ {
718
+ 'regex': 'Symbian',
719
+ 'deviceReplacement': 'Nokia'
720
+ },
721
+ {
722
+ 'regex': '(PlayBook).+RIM Tablet OS',
723
+ 'deviceReplacement': 'Blackberry Playbook'
724
+ },
725
+ {
726
+ 'regex': '(Black[Bb]erry [0-9]+);'
727
+ },
728
+ {
729
+ 'regex': 'Black[Bb]erry([0-9]+)',
730
+ 'deviceReplacement': 'BlackBerry $1'
731
+ },
732
+ {
733
+ 'regex': '(Pre)/(\\d+)\\.(\\d+)',
734
+ 'deviceReplacement': 'Palm Pre'
735
+ },
736
+ {
737
+ 'regex': '(Pixi)/(\\d+)\\.(\\d+)',
738
+ 'deviceReplacement': 'Palm Pixi'
739
+ },
740
+ {
741
+ 'regex': '(Touchpad)/(\\d+)\\.(\\d+)',
742
+ 'deviceReplacement': 'HP Touchpad'
743
+ },
744
+ {
745
+ 'regex': 'HPiPAQ([A-Za-z0-9]+)/(\\d+).(\\d+)',
746
+ 'deviceReplacement': 'HP iPAQ $1'
747
+ },
748
+ {
749
+ 'regex': 'Palm([A-Za-z0-9]+)',
750
+ 'deviceReplacement': 'Palm $1'
751
+ },
752
+ {
753
+ 'regex': 'Treo([A-Za-z0-9]+)',
754
+ 'deviceReplacement': 'Palm Treo $1'
755
+ },
756
+ {
757
+ 'regex': 'webOS.*(P160UNA)/(\\d+).(\\d+)',
758
+ 'deviceReplacement': 'HP Veer'
759
+ },
760
+ {
761
+ 'regex': '(PlayStation Portable)'
762
+ },
763
+ {
764
+ 'regex': '(PlayStation Vita)'
765
+ },
766
+ {
767
+ 'regex': '(Kindle Fire)'
768
+ },
769
+ {
770
+ 'regex': '(Kindle)'
771
+ },
772
+ {
773
+ 'regex': '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?',
774
+ 'deviceReplacement': 'Kindle Fire'
775
+ },
776
+ {
777
+ 'regex': '(iPad) Simulator;'
778
+ },
779
+ {
780
+ 'regex': '(iPad);'
781
+ },
782
+ {
783
+ 'regex': '(iPod);'
784
+ },
785
+ {
786
+ 'regex': '(iPhone) Simulator;'
787
+ },
788
+ {
789
+ 'regex': '(iPhone);'
790
+ },
791
+ {
792
+ 'regex': 'acer_([A-Za-z0-9]+)_',
793
+ 'deviceReplacement': 'Acer $1'
794
+ },
795
+ {
796
+ 'regex': 'acer_([A-Za-z0-9]+)_',
797
+ 'deviceReplacement': 'Acer $1'
798
+ },
799
+ {
800
+ 'regex': 'Amoi\\-([A-Za-z0-9]+)',
801
+ 'deviceReplacement': 'Amoi $1'
802
+ },
803
+ {
804
+ 'regex': 'AMOI\\-([A-Za-z0-9]+)',
805
+ 'deviceReplacement': 'Amoi $1'
806
+ },
807
+ {
808
+ 'regex': 'Asus\\-([A-Za-z0-9]+)',
809
+ 'deviceReplacement': 'Asus $1'
810
+ },
811
+ {
812
+ 'regex': 'ASUS\\-([A-Za-z0-9]+)',
813
+ 'deviceReplacement': 'Asus $1'
814
+ },
815
+ {
816
+ 'regex': 'BIRD\\-([A-Za-z0-9]+)',
817
+ 'deviceReplacement': 'Bird $1'
818
+ },
819
+ {
820
+ 'regex': 'BIRD\\.([A-Za-z0-9]+)',
821
+ 'deviceReplacement': 'Bird $1'
822
+ },
823
+ {
824
+ 'regex': 'BIRD ([A-Za-z0-9]+)',
825
+ 'deviceReplacement': 'Bird $1'
826
+ },
827
+ {
828
+ 'regex': 'Dell ([A-Za-z0-9]+)',
829
+ 'deviceReplacement': 'Dell $1'
830
+ },
831
+ {
832
+ 'regex': 'DoCoMo/2\\.0 ([A-Za-z0-9]+)',
833
+ 'deviceReplacement': 'DoCoMo $1'
834
+ },
835
+ {
836
+ 'regex': '([A-Za-z0-9]+)\\_W\\;FOMA',
837
+ 'deviceReplacement': 'DoCoMo $1'
838
+ },
839
+ {
840
+ 'regex': '([A-Za-z0-9]+)\\;FOMA',
841
+ 'deviceReplacement': 'DoCoMo $1'
842
+ },
843
+ {
844
+ 'regex': 'vodafone([A-Za-z0-9]+)',
845
+ 'deviceReplacement': 'Huawei Vodafone $1'
846
+ },
847
+ {
848
+ 'regex': 'i\\-mate ([A-Za-z0-9]+)',
849
+ 'deviceReplacement': 'i-mate $1'
850
+ },
851
+ {
852
+ 'regex': 'Kyocera\\-([A-Za-z0-9]+)',
853
+ 'deviceReplacement': 'Kyocera $1'
854
+ },
855
+ {
856
+ 'regex': 'KWC\\-([A-Za-z0-9]+)',
857
+ 'deviceReplacement': 'Kyocera $1'
858
+ },
859
+ {
860
+ 'regex': 'Lenovo\\-([A-Za-z0-9]+)',
861
+ 'deviceReplacement': 'Lenovo $1'
862
+ },
863
+ {
864
+ 'regex': 'Lenovo\\_([A-Za-z0-9]+)',
865
+ 'deviceReplacement': 'Lenovo $1'
866
+ },
867
+ {
868
+ 'regex': 'LG/([A-Za-z0-9]+)',
869
+ 'deviceReplacement': 'LG $1'
870
+ },
871
+ {
872
+ 'regex': 'LG-LG([A-Za-z0-9]+)',
873
+ 'deviceReplacement': 'LG $1'
874
+ },
875
+ {
876
+ 'regex': 'LGE-LG([A-Za-z0-9]+)',
877
+ 'deviceReplacement': 'LG $1'
878
+ },
879
+ {
880
+ 'regex': 'LGE VX([A-Za-z0-9]+)',
881
+ 'deviceReplacement': 'LG $1'
882
+ },
883
+ {
884
+ 'regex': 'LG ([A-Za-z0-9]+)',
885
+ 'deviceReplacement': 'LG $1'
886
+ },
887
+ {
888
+ 'regex': 'LGE LG\\-AX([A-Za-z0-9]+)',
889
+ 'deviceReplacement': 'LG $1'
890
+ },
891
+ {
892
+ 'regex': 'LG\\-([A-Za-z0-9]+)',
893
+ 'deviceReplacement': 'LG $1'
894
+ },
895
+ {
896
+ 'regex': 'LGE\\-([A-Za-z0-9]+)',
897
+ 'deviceReplacement': 'LG $1'
898
+ },
899
+ {
900
+ 'regex': 'LG([A-Za-z0-9]+)',
901
+ 'deviceReplacement': 'LG $1'
902
+ },
903
+ {
904
+ 'regex': '(KIN)\\.One (\\d+)\\.(\\d+)',
905
+ 'deviceReplacement': 'Microsoft $1'
906
+ },
907
+ {
908
+ 'regex': '(KIN)\\.Two (\\d+)\\.(\\d+)',
909
+ 'deviceReplacement': 'Microsoft $1'
910
+ },
911
+ {
912
+ 'regex': '(Motorola)\\-([A-Za-z0-9]+)'
913
+ },
914
+ {
915
+ 'regex': 'MOTO\\-([A-Za-z0-9]+)',
916
+ 'deviceReplacement': 'Motorola $1'
917
+ },
918
+ {
919
+ 'regex': 'MOT\\-([A-Za-z0-9]+)',
920
+ 'deviceReplacement': 'Motorola $1'
921
+ },
922
+ {
923
+ 'regex': 'Philips([A-Za-z0-9]+)',
924
+ 'deviceReplacement': 'Philips $1'
925
+ },
926
+ {
927
+ 'regex': 'Philips ([A-Za-z0-9]+)',
928
+ 'deviceReplacement': 'Philips $1'
929
+ },
930
+ {
931
+ 'regex': 'SAMSUNG-([A-Za-z0-9\\-]+)',
932
+ 'deviceReplacement': 'Samsung $1'
933
+ },
934
+ {
935
+ 'regex': 'SAMSUNG\\; ([A-Za-z0-9\\-]+)',
936
+ 'deviceReplacement': 'Samsung $1'
937
+ },
938
+ {
939
+ 'regex': 'Softbank/1\\.0/([A-Za-z0-9]+)',
940
+ 'deviceReplacement': 'Softbank $1'
941
+ },
942
+ {
943
+ 'regex': 'Softbank/2\\.0/([A-Za-z0-9]+)',
944
+ 'deviceReplacement': 'Softbank $1'
945
+ },
946
+ {
947
+ 'regex': '(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)',
948
+ 'deviceReplacement': 'Generic Smartphone'
949
+ },
950
+ {
951
+ 'regex': '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|craw|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly\\_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)',
952
+ 'deviceReplacement': 'Generic Feature Phone'
953
+ },
954
+ {
955
+ 'regex': '^(htcp|htcs|htct|htc\\_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|lynx|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)',
956
+ 'deviceReplacement': 'Generic Feature Phone'
957
+ },
958
+ {
959
+ 'regex': '^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)',
960
+ 'deviceReplacement': 'Generic Feature Phone'
961
+ },
962
+ {
963
+ 'regex': '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda\\_)',
964
+ 'deviceReplacement': 'Generic Feature Phone'
965
+ },
966
+ {
967
+ 'regex': '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\\-webcrawler|converacrawler|dataparksearch|findlinks)',
968
+ 'deviceReplacement': 'Spider'
969
+ }
970
+ ],
971
+ 'mobileUserAgentFamilies': [
972
+ 'Firefox Mobile',
973
+ 'Opera Mobile',
974
+ 'Opera Mini',
975
+ 'Mobile Safari',
976
+ 'webOS',
977
+ 'IE Mobile',
978
+ 'Playstation Portable',
979
+ 'Nokia',
980
+ 'Blackberry',
981
+ 'Palm',
982
+ 'Silk',
983
+ 'Android',
984
+ 'Maemo',
985
+ 'Obigo',
986
+ 'Netfront',
987
+ 'AvantGo',
988
+ 'Teleca',
989
+ 'SEMC-Browser',
990
+ 'Bolt',
991
+ 'Iris',
992
+ 'UP.Browser',
993
+ 'Symphony',
994
+ 'Minimo',
995
+ 'Bunjaloo',
996
+ 'Jasmine',
997
+ 'Dolfin',
998
+ 'Polaris',
999
+ 'BREW',
1000
+ 'Chrome Mobile',
1001
+ 'UC Browser',
1002
+ 'Tizen Browser'
1003
+ ]
1004
+ };
1005
+
1006
+
1007
+ /**
1008
+ * Function to loop through our big array or one provided externally to the
1009
+ * function and compare each regex to the user agent being reported by the
1010
+ * user's browser. Then return what browser matches.
1011
+ * @param {array} regexArray is an array of regexes.
1012
+ * @return {string} Browser name that matches the regex of the user agent.
1013
+ */
1014
+ ww.userAgent.getBrowserName = function(regexArray) {
1015
+
1016
+ if (regexArray) {
1017
+ browserData = regexArray;
1018
+ }
1019
+
1020
+ for (var i = 0; i < browserData['userAgentParsers'].length; i++) {
1021
+
1022
+ // Get the regex value of the current index and make a regex object from it.
1023
+ var currentItem =
1024
+ new RegExp(browserData['userAgentParsers'][i]['regex']);
1025
+
1026
+ // Check the string of the user agent against our current regex value.
1027
+ var browserMatch = currentItem.exec(navigator.userAgent);
1028
+
1029
+ // If the regex value matches the user agent, create a string to return.
1030
+ if (browserMatch) {
1031
+
1032
+ /**
1033
+ * If the UA doesn't report a proper browser name, use the replacement
1034
+ * from our browserData array.
1035
+ */
1036
+ if (browserData['userAgentParsers'][i]['familyReplacement']) {
1037
+ var browserName =
1038
+ browserData['userAgentParsers'][i]['familyReplacement'];
1039
+
1040
+ // If the UA provides all the default data then create the string from it.
1041
+ } else {
1042
+ var browserName = browserMatch[1];
1043
+ }
1044
+
1045
+ return browserName;
1046
+ }
1047
+
1048
+ }
1049
+
1050
+ };
1051
+
1052
+ goog.exportSymbol('ww.userAgent.getBrowserName', ww.userAgent.getBrowserName);
1053
+
1054
+ /**
1055
+ * Function to loop through our big array or one provided externally to the
1056
+ * function and compare each regex to the user agent being reported by the
1057
+ * user's browser. Then return what browser version matches.
1058
+ * @param {array} regexArray is an array of regexes.
1059
+ * @return {string} Browser version that matches the regex of the user agent.
1060
+ */
1061
+ ww.userAgent.getBrowserV = function(regexArray) {
1062
+
1063
+ if (regexArray) {
1064
+ browserData = regexArray;
1065
+ }
1066
+
1067
+ for (var i = 0; i < browserData['userAgentParsers'].length; i++) {
1068
+
1069
+ // Get the regex value of the current index and make a regex object from it.
1070
+ var currentItem =
1071
+ new RegExp(browserData['userAgentParsers'][i]['regex']);
1072
+
1073
+ // Check the string of the user agent against our current regex value.
1074
+ var browserMatch = currentItem.exec(navigator.userAgent);
1075
+
1076
+ // If the regex value matches the user agent, create a string to return.
1077
+ if (browserMatch) {
1078
+ /**
1079
+ * If the UA doesn't report a proper browser version, use the replacement
1080
+ * from our browserData array.
1081
+ */
1082
+ if (browserData['userAgentParsers'][i]['v1Replacement']) {
1083
+ var browserVersion =
1084
+ browserData['userAgentParsers'][i]['v1Replacement'];
1085
+
1086
+ // If there is a browser subversion replacement, add it to our string.
1087
+ if (browserData['userAgentParsers'][i]['v2Replacement']) {
1088
+ browserVersion +=
1089
+ '.' + browserData['userAgentParsers'][i]['v2Replacement'];
1090
+ }
1091
+
1092
+ // If the UA provides all the default data then create the string from it.
1093
+ } else {
1094
+ var browserVersion = browserMatch[2];
1095
+ }
1096
+
1097
+ return browserVersion;
1098
+ }
1099
+
1100
+ }
1101
+
1102
+ };
1103
+
1104
+ goog.exportSymbol('ww.userAgent.getBrowserV', ww.userAgent.getBrowserV);
1105
+
1106
+
1107
+ /**
1108
+ * Function to loop through our big array or one provided externally to the
1109
+ * function and compare each regex to the user agent being reported by the
1110
+ * user's browser. Then return what OS matches.
1111
+ * @param {array} regexArray is an array of regexes.
1112
+ * @return {string} The OS name that matches the regex of the user agent.
1113
+ */
1114
+ ww.userAgent.getOS = function(regexArray) {
1115
+
1116
+ if (regexArray) {
1117
+ browserData = regexArray;
1118
+ }
1119
+
1120
+ for (var i = 0; i < browserData['osParsers'].length; i++) {
1121
+
1122
+ // Get the regex value of the current index and make a regex object from it.
1123
+ var currentItem =
1124
+ new RegExp(browserData['osParsers'][i]['regex']);
1125
+
1126
+ // Check the string of the user agent against our current regex value.
1127
+ var browserMatch = currentItem.exec(navigator.userAgent);
1128
+
1129
+ // If the regex value matches the user agent, create a string to return.
1130
+ if (browserMatch) {
1131
+
1132
+ /**
1133
+ * If the UA doesn't report a proper OS name, use the replacement
1134
+ * from our browserData array.
1135
+ */
1136
+ if (browserData['osParsers'][i]['osReplacement']) {
1137
+ var OS = browserData['osParsers'][i]['osReplacement'];
1138
+
1139
+ // If the UA provides all the default data then create the string from it.
1140
+ } else {
1141
+ var OS = browserMatch[1];
1142
+ }
1143
+
1144
+ return OS;
1145
+ }
1146
+
1147
+ }
1148
+
1149
+ };
1150
+
1151
+ goog.exportSymbol('ww.userAgent.getOS', ww.userAgent.getOS);
1152
+
1153
+
1154
+ /**
1155
+ * Function to loop through our big array or one provided externally to the
1156
+ * function and compare each regex to the user agent being reported by the
1157
+ * user's browser. Then return what OS version matches.
1158
+ * @param {array} regexArray is an array of regexes.
1159
+ * @return {string} The OS Version that matches the regex of the user agent.
1160
+ */
1161
+ ww.userAgent.getOSV = function(regexArray) {
1162
+
1163
+ if (regexArray) {
1164
+ browserData = regexArray;
1165
+ }
1166
+
1167
+ for (var i = 0; i < browserData['osParsers'].length; i++) {
1168
+
1169
+ // Get the regex value of the current index and make a regex object from it.
1170
+ var currentItem =
1171
+ new RegExp(browserData['osParsers'][i]['regex']);
1172
+
1173
+ // Check the string of the user agent against our current regex value.
1174
+ var browserMatch = currentItem.exec(navigator.userAgent);
1175
+
1176
+ // If the regex value matches the user agent, create a string to return.
1177
+ if (browserMatch) {
1178
+
1179
+ /**
1180
+ * If the UA doesn't report a proper OS version, use the replacement
1181
+ * from our browserData array.
1182
+ */
1183
+ if (browserData['osParsers'][i]['osV1Replacement']) {
1184
+ var osVersion = browserData['osParsers'][i]['osV1Replacement'];
1185
+
1186
+ // If there is a browser subversion replacement, add it to our string.
1187
+ if (browserData['osParsers'][i]['osV2Replacement']) {
1188
+ osVersion +=
1189
+ '.' + browserData['osParsers'][i]['osV2Replacement'];
1190
+ }
1191
+
1192
+ // If the UA provides all the default data then create the string from it.
1193
+ } else {
1194
+ var osVersion = '';
1195
+ if (browserMatch[2]) {
1196
+ osVersion += browserMatch[2];
1197
+ }
1198
+ if (browserMatch[3]) {
1199
+ osVersion += '.' + browserMatch[3];
1200
+ }
1201
+ if (browserMatch[4]) {
1202
+ osVersion += '.' + browserMatch[4];
1203
+ }
1204
+ }
1205
+
1206
+ return osVersion;
1207
+ }
1208
+
1209
+ }
1210
+
1211
+ };
1212
+
1213
+ goog.exportSymbol('ww.userAgent.getOSV', ww.userAgent.getOSV);
1214
+
1215
+
1216
+ /**
1217
+ * Function to report back if the detected user agent is a mobile device
1218
+ * @param {array} regexArray is an array of regexes.
1219
+ * @return {boolean} Returns true if a mobile device matches the user agent.
1220
+ */
1221
+
1222
+ ww.userAgent.isMobile = function(regexArray) {
1223
+
1224
+ if (regexArray) {
1225
+ browserData = regexArray;
1226
+ }
1227
+
1228
+ for (var i = 0; i < browserData['deviceParsers'].length; i++) {
1229
+
1230
+ // Get the regex value of the current index and make a regex object from it.
1231
+ var currentItem =
1232
+ new RegExp(browserData['deviceParsers'][i]['regex']);
1233
+
1234
+ // Check the string of the user agent against our current regex value.
1235
+ var browserMatch = currentItem.exec(navigator.userAgent);
1236
+
1237
+ if (browserMatch) {
1238
+ return true;
1239
+ }
1240
+ }
1241
+
1242
+ };
1243
+
1244
+ goog.exportSymbol('ww.userAgent.isMobile', ww.userAgent.isMobile);