useragent.js
Version:
A simple project that allows you to display details about a computer's operating system or web browser with a user-agent.
1,988 lines (1,932 loc) • 48 kB
JavaScript
;
(function (root) {
var BROWSER = {}
var browserList = [
'11(4|5)Browser', '2345(Explorer|chrome)', 'Conkeror',
'Alienforce', 'Amaya', 'Arora',
'Beamrise',
'Beonex', 'Blazer', 'bidubrowser', 'Blackbird',
'Bolt', 'Browzar', 'Bunjalloo', 'Camino',
'Chromium', 'Classilla', 'Coast', 'Columbus',
'Cruz', 'Cyberdog', 'Demeter', 'Dooble', 'dillo',
'Doris', 'Edbrowse', 'E?links',
'Epiphany', 'Escape|Espial', 'Fennec',
'Firebird', 'Flock', 'Fluid', 'Galeon',
'Hv3', 'Iris', 'lolifox',
'Iceape', 'Hana',
'Kapiko', 'Kazehakase', 'Kinza', 'Konqueror', 'Kylo',
'Lunascape', 'Lynx', 'Madfox', 'Maxthon',
'Midori', 'Minefield', 'Minimo',
'Mosaic', 'Netscape',
'Obigo', 'Orca',
'Oregano', 'Otter',
'Perk', 'Phoenix', 'Podkicker',
'Ryouko', 'Sleipnir',
'Shiira', 'Skyfire',
'Stainless', 'Sundance', 'Sunrise',
'Surf', 'Swiftfox', 'Swiftweasel',
'Thunderbird',
'Tjusig', 'UC? ?Browser|UCWEB',
'polarity', 'polaris', 'pogo', 'prism', 'superbird', 'songbird',
'Usejump', 'Vivaldi', 'Wyzo', 'WhatsApp', 'Weibo'
]
var defaultBrowserList = {
'360se': {
title: '360 Explorer'
},
'360ee': {
title: '360 Chrome',
image: '360se'
},
'360 aphone browser': {
title: '360 Aphone Browser',
image: '360se'
},
'abolimba': {
title: 'Abolimba'
},
'acoo browser': {
title: '{%Acoo Browser%}',
image: 'acoobrowser'
},
'amiga-aweb': {
title: 'Amiga {%AWeb%}',
image: 'amiga-aweb'
},
'antfresco': {
title: 'ANT {%Fresco%}'
},
'mrchrome': {
title: 'Amigo',
image: 'amigo'
},
'myibrow': {
title: '{%myibrow%}',
image: 'my-internet-browser'
},
'america online browser': {
title: '{%America Online Browser%}',
image: 'aol'
},
'amigavoyager': {
title: 'Amiga {%Voyager%}'
},
'aol': {
upper: [0, 1, 2] // AOL
},
'atomicbrowser': {
upper: [0, 6], // AtomicBrowser
image: 'atomicwebbrowser'
},
'barcapro': {
title: '{%BarcaPro%}',
image: 'barca'
},
'baidubrowser': {
image: 'bidubrowser'
},
'baiduboxapp': {
title: '{%BaiduBoxApp%}',
image: 'bidubrowser'
},
'baiduhd': {
title: '{%BaiduHD%}',
image: 'bidubrowser'
},
'blackhawk': {
upper: [0, 5] // BlackHawk
},
'bonecho': {
title: '{%BonEcho%}',
image: 'firefoxdevpre'
},
'browsex': {
upper: [0, 6] // BrowseX
},
'cayman browser': {
title: '{%Cayman Browser%}',
image: 'caymanbrowser'
},
'charon': {
image: 'null'
},
'cheshire': {
image: 'aol'
},
'chimera': {
image: 'null'
},
'chromeframe': {
image: 'chrome'
},
'chromeplus': {
title: '{%ChromePlus%}'
},
'iron': {
title: 'SRWare {%Iron%}',
image: 'srwareiron'
},
'cometbird': {
upper: [0, 5]
},
'comodo_dragon': {
title: 'Comodo {%Dragon%}',
image: 'comodo-dragon'
},
'coolnovo': {
upper: [0, 4]
},
'corom': {
upper: [0, 2] // CoRom
},
'crazy browser': {
upper: [0, 6],
image: 'crazybrowser'
},
'crmo': {
upper: [0, 2], // CrMo
image: 'chrome'
},
'dplus': {
upper: [0, 1], // DPlus
image: 'dillo'
},
'deepnet explorer': {
upper: [0, 8],
image: 'deepnetexplorer'
},
'deskbrowse': {
upper: [0, 4]
},
'docomo': {
upper: [0, 2, 4], // DoCoMo
image: 'null'
},
'doczilla': {
upper: [0, 3]
},
'dolfin': {
image: 'samsung'
},
'dorothy': {
image: 'dorothybrowser'
},
'element browser': {
upper: [0, 8],
image: 'elementbrowser'
},
'enigma browser': {
upper: [0, 7],
image: 'enigmabrowser'
},
'enigmafox': {
upper: [0, 6],
image: 'null'
},
'epic': {
image: 'epicbrowser'
},
'escape': {
image: 'espialtvbrowser'
},
'espial': {
image: 'espialtvbrowser'
},
'fireweb navigator': {
upper: [0, 8],
image: 'firewebnavigator'
},
'fbav': {
title: '{%FBAV%}',
image: 'facebook'
},
'globalmojo': {
upper: [0, 6]
},
'gobrowser': {
upper: [0, 1, 2]
},
'google wireless transcoder': {
title: 'Google Wireless Transcoder',
image: 'google'
},
'google earth': {
upper: [0, 7],
image: 'google'
},
'google.android.apps': {
title: 'Google App',
image: 'google'
},
'googleplus': {
title: 'Google+',
image: 'google'
},
'youtube': {
title: '{%Youtube%}',
image: 'google'
},
'gosurf': {
upper: [0, 2]
},
'granparadiso': {
upper: [0, 4],
image: 'firefoxdevpre'
},
'greenbrowser': {
upper: [0, 5]
},
'gsa': {
upper: [0, 1, 2],
image: 'google'
},
'hotjava': {
upper: [0, 3]
},
'hydra browser': {
title: 'Hydra Browser',
image: 'hydrabrowser'
},
'ibm webexplorer': {
title: 'IBM {%WebExplorer%}',
image: 'ibmwebexplorer'
},
'juzibrowser': {
upper: [0, 4]
},
'miuibrowser': {
upper: [0, 4]
},
'mxnitro': {
upper: [0, 2]
},
'ibrowse': {
upper: [0, 1]
},
'icab': {
upper: [1]
},
'icebrowser': {
upper: [0, 3]
},
'icecat': {
title: 'GNU {%IceCat%}'
},
'icedragon': {
upper: [0, 3]
},
'iceweasel': {
upper: [0, 3]
},
'inet browser': {
upper: [1, 5],
image: 'null'
},
'irider': {
upper: [1]
},
'internetsurfboard': {
upper: [0, 8]
},
'itunes': {
upper: [1]
},
'jasmine': {
image: 'samsung'
},
'k-meleon': {
upper: [0, 2],
image: 'kmeleon'
},
'k-ninja': {
upper: [0, 2],
image: 'kninja'
},
'strata': {
title: 'Kirix {%Strata%}',
image: 'kirix-strata'
},
'sailfishbrowser': {
title: '{%SailfishBrowser%}',
upper: [0, 8]
},
'kkman': {
upper: [0, 1]
},
'kmail': {
upper: [0, 1]
},
'kmlite': {
upper: [0, 1, 2],
image: 'kmeleon'
},
'lbrowser': {
upper: [0, 1]
},
'links': {
image: 'null'
},
'lbbrowser': {
title: 'Liebao Browser'
},
'liebaofast': {
image: 'lbbrowser'
},
'leechcraft': {
title: 'LeechCraft',
image: 'null'
},
'lobo': {
upper: [0]
},
'lorentz': {
upper: [0],
image: 'firefoxdevpre'
},
'maemo browser': {
upper: [0, 6],
image: 'maemo'
},
' mib/': {
title: '{%MIB%}',
image: 'mib'
},
'micromessenger': {
upper: [0, 5],
image: 'wechat'
},
'microsoft office': {
title: '{%Microsoft Office%}',
upper: [0, 10],
image: 'office'
},
'minibrowser': {
upper: [0, 5]
},
'mozilladeveloperpreview': {
title: '{%MozillaDeveloperPreview%}',
image: 'firefoxdevpre'
},
'mqqbrowser': {
upper: [0, 1, 2, 3], // MQQBrowser
image: 'qqbrowser'
},
'multi-browser': {
upper: [0, 6],
image: 'multi-browserxp'
},
'multizilla': {
upper: [0, 5],
image: 'mozilla'
},
'myie2': {
upper: [0, 2, 3]
},
'namoroka': {
image: 'firefoxdevpre'
},
'navigator': {
title: 'Netscape {%Navigator%}',
image: 'netscape'
},
'netbox': {
upper: [0, 3]
},
'netcaptor': {
upper: [0, 3]
},
'netfront': {
upper: [0, 3]
},
'netnewswire': {
upper: [0, 3, 7]
},
'netpositive': {
upper: [0, 3]
},
'netsurf': {
upper: [0, 3]
},
'nf-browser': {
upper: [0, 1, 2, 4],
image: 'netfront'
},
'nichrome/self': {
title: '{%Nichrome/self%}',
image: 'nichromeself'
},
'nokiabrowser': {
title: 'Nokia {%Browser%}',
image: 'nokia'
},
'novarra-vision': {
title: 'Novarra {%Vision%}',
image: 'novarra'
},
'offbyone': {
title: 'Off By One'
},
'omniweb': {
upper: [0, 4]
},
'onebrowser': {
upper: [0, 3]
},
'origyn web browser': {
title: 'Oregano Web Browser',
image: 'owb'
},
'osb-browser': {
image: 'null'
},
' pre/': {
title: 'Palm {%Pre%}',
image: 'palmpre'
},
'palemoon': {
title: 'Pale {%Moon%}'
},
'patriott::browser': {
title: 'Patriott {%Browser%}',
image: 'patriott'
},
'phaseout': {
title: 'Phaseout'
},
'playstation 4': {
title: 'PS4 Web Browser',
image: 'webkit'
},
'podkicker pro': {
upper: [0, 8],
image: 'podkicker'
},
'qqbrowser': {
upper: [0, 1, 2]
},
'qtweb internet browser': {
title: '{%QtWeb Internet Browser%}',
image: 'qtwebinternetbrowser'
},
'qtcarbrowser': {
image: 'tesla'
},
'qupzilla': {
upper: [0, 3]
},
'rekonq': {
title: 'rekonq'
},
'retawq': {
image: 'terminal'
},
'rockmelt': {
upper: [0, 4]
},
'saayaa': {
title: 'SaaYaa Explorer'
},
'seamonkey': {
upper: [0, 3]
},
'semc-browser': {
upper: [0, 1, 2, 3, 5],
image: 'semcbrowser'
},
'semc-java': {
upper: [0, 1, 2, 3],
image: 'semcbrowser'
},
'shiretoko': {
upper: [0],
image: 'firefoxdevpre'
},
'sitekiosk': {
upper: [0, 4]
},
'skipstone': {
upper: [0, 4]
},
'silk': {
title: 'Amazon {%Silk%}'
},
'slimboat': {
upper: [0, 4]
},
'slimbrowser': {
upper: [0, 4]
},
'smarttv': {
upper: [0, 5, 6],
image: 'maplebrowser'
},
'substream': {
upper: [0, 3]
},
'sulfur': {
title: 'Flock {%Sulfur%}',
image: 'flock'
},
'sylera': {
upper: [0],
image: 'null'
},
'taobrowser': {
upper: [0, 3]
},
'tear': {
title: 'Tear'
},
'teashark': {
upper: [0, 3]
},
'teleca': {
image: 'obigo'
},
'tencenttraveler': {
title: 'Tencent {%Traveler%}'
},
'tenfourfox': {
upper: [0, 3, 7]
},
'tizenbrowser': {
title: '{%TizenBrowser%}',
image: 'tizen'
},
'tizen browser': {
title: '{%Tizen Browser%}',
image: 'tizen'
},
'theworld': {
title: 'TheWorld Browser'
},
'ubrowser': {
upper: [0, 1],
image: 'ucbrowser'
},
'ucbrowser': {
upper: [0, 1, 2, 3]
},
'uc browser': {
upper: [0, 1, 2, 4],
image: 'ucbrowser'
},
'ucweb': {
upper: [0, 1, 2, 3, 4],
image: 'ucbrowser'
},
'ultrabrowser': {
upper: [0, 5]
},
'up.browser': {
upper: [0, 3],
image: 'openwave'
},
'up.link': {
upper: [0, 3],
image: 'openwave'
},
'uzardweb': {
title: '{%uZardWeb%}'
},
'uzard': {
upper: [1],
image: 'uzardweb'
},
'uzbl': {
title: 'uzbl'
},
'vimprobable': {
upper: [0],
image: 'null'
},
'vonkeror': {
upper: [0],
image: 'null'
},
'w3m': {
upper: [0, 2]
},
'wget': {
image: 'null'
},
'curl': {
image: 'null'
},
'iemobile': {
upper: [0, 1, 2],
image: 'msie-mobile'
},
'waterfox': {
upper: [0, 5]
},
'webianshell': {
title: 'Webian {%Shell%}'
},
'webrender': {
upper: [0]
},
'weltweitimnetzbrowser': {
title: 'Weltweitimnetz {%Browser%}',
image: 'weltweitimnetzbrowser'
},
'whitehat aviator': {
upper: [0, 5, 9],
image: 'aviator'
},
'wkiosk': {
title: 'wKiosk'
},
'worldwideweb': {
upper: [0, 5, 9]
},
'x-smiles': {
upper: [0, 2]
},
'xiino': {
image: 'null'
},
'yabrowser': {
upper: [0, 2],
image: 'yandex'
},
'zbrowser': {
upper: [1]
},
'zipzap': {
upper: [0, 3]
},
'abrowse': {
title: '{%ABrowse Browser%}'
},
'none': {
title: 'Unknown',
image: 'unknown'
}
}
var browserRegEx = new RegExp(browserList.concat(Object.keys(defaultBrowserList)).join('|'), 'i')
var displayNameList = {
'msie': {
callback: function (rep, ret) {
if (ret.version === '7.0' && /Trident\/4.0/i.test(ret.ua)) {
ret.name = ' 8.0 (Compatibility Mode)'
ret.version = ''
} else {
ret.name = ''
}
}
},
'microsoft office': {
callback: function (rep, ret) {
ret.version = '' // Do not detect it
/**
* Microsoft Office Upload Center 2013 (15.0.4693) Windows NT 6.2
* Microsoft Office/15.0 (Windows NT 6.2; Microsoft Excel 15.0.4693; Pro)
*
* I can't find the best way to detect the version of Office
*/
}
},
'nf-browser': {
name: 'NetFront'
},
'semc-browser': {
name: 'SEMC Browser'
},
'ucweb': {
name: 'UC Browser'
},
'ubrowser': {
name: 'UC Browser'
},
'ucbrowser': {
name: 'UC Browser'
},
'uc browser': {
name: 'UC Browser'
},
'bidubrowser': {
name: 'Baidu Browser'
},
'baidubrowser': {
name: 'Baidu Browser'
},
'baiduhd': {
name: 'Baidu Browser'
},
'up.browser': {
name: 'Openwave Mobile Browser'
},
'up.link': {
name: 'Openwave Mobile Browser'
},
'chromeframe': {
name: 'Google Chrome Frame'
},
'mozilladeveloperpreview': {
name: 'Mozilla Developer Preview'
},
'opera mobi': {
name: 'Opera Mobile'
},
'osb-browser': {
name: 'Gtk+ WebCore'
},
'tablet browser': {
name: 'MicroB'
},
'crmo': {
name: 'Chrome Mobile'
},
'smarttv': {
name: 'Maple Browser'
},
'miuibrowser': {
name: 'MIUI Browser'
},
'sailfishbrowser': {
name: 'Sailfish Browser'
},
'fbav': {
name: 'Facebook'
},
'atomicbrowser': {
name: 'Atomic Web Browser'
},
'dplus': {
name: 'D+'
},
'micromessenger': {
name: 'WeChat'
},
'nichrome/self': {
name: 'NiChrome'
},
'tizenbrowser': {
name: 'Tizen Browser'
},
'gsa': {
name: 'Google Search App'
},
'opera labs': {
callback: function (rep, ret) {
rep = ret.ua.match(/Edition Labs([ ._0-9a-zA-Z]+);/i)
if (rep !== null) {
ret.version = rep[1]
} else {
ret.version = ''
}
}
},
'qtcarbrowser': {
name: 'Tesla Car Browser',
version: ''
},
'iceweasel': {
callback: function (rep, ret) {
if (ret.version === 'Firefox') {
ret.version = ''
}
}
},
'yabrowser': {
callback: function (rep, ret) {
ret.name = 'Yandex.Browser'
}
}
}
var setRetName = function (ret, rep) {
ret.image = rep.image
ret.full = rep.title.replace(/\{%(.+)%\}/, function (match, p1) {
return getVersion(ret, p1)
})
}
var getVersion = function (ret, title) {
var lowerTitle = title.toLowerCase()
var start = lowerTitle
ret.name = title
if ((lowerTitle === 'opera' || lowerTitle === 'opera next' || lowerTitle === 'opera developer') && /OPR/i.test(ret.ua)) {
start = 'OPR'
} else if (
((lowerTitle === 'opera' || lowerTitle === 'opera next' || lowerTitle === 'opera labs') && /Version/i.test(ret.ua)) ||
((lowerTitle === 'opera mobi' && /Version/i.test(ret.ua))) ||
((lowerTitle === 'safari' && /Version/i.test(ret.ua))) ||
((lowerTitle === 'pre' && /Version/i.test(ret.ua))) ||
((lowerTitle === 'android webkit'))
) {
start = 'Version'
} else if (lowerTitle === 'links') {
start = 'Links ('
} else if (lowerTitle === 'smarttv') {
start = 'WebBrowser'
} else if (lowerTitle === 'ucweb' && /UCBrowser/i.test(ret.ua)) {
start = 'UCBrowser'
} else if (
(lowerTitle === 'tenfourfox' || lowerTitle === 'classilla' || lowerTitle === 'msie') && / rv:([.0-9a-zA-Z]+)/i.test(ret.ua)
) {
// We have IE11 or newer
start = ' rv'
} else if (lowerTitle === 'nichrome/self') {
start = 'self'
} else if (lowerTitle === 'edga') {
ret.name = 'Edge Android'
}
start = start.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]', 'g'), '\\$&')
var regEx = new RegExp(start + '[ |/|:]?([.0-9a-zA-Z]+)', 'i')
var rep = ret.ua.match(regEx)
if (rep !== null) {
ret.version = rep[1]
} else {
ret.version = ''
}
if (ret.version.toLowerCase() === 'build') { // To Fix some ua like 'Amazon Otter Build/KTU84M'
ret.version = ''
}
if (lowerTitle in displayNameList) {
if ('callback' in displayNameList[lowerTitle]) {
displayNameList[lowerTitle].callback(rep, ret)
} else {
for (var tempVar in displayNameList[lowerTitle]) {
ret[tempVar] = displayNameList[lowerTitle][tempVar]
}
}
}
return ret.name + (ret.version !== '' ? (' ' + ret.version) : '')
}
BROWSER.analyze = function (uaString) {
var ret = {
ua: uaString,
name: '',
version: '',
full: '',
image: '',
dir: 'browser'
}
var res = uaString.match(browserRegEx)
var rep = null
if (res !== null) {
var name = res[0].toLowerCase()
var upper = null
rep = {}
if (defaultBrowserList[name]) {
Object.keys(defaultBrowserList[name]).forEach(function (key) {
if (key !== 'upper') {
rep[key] = defaultBrowserList[name][key]
} else {
upper = defaultBrowserList[name].upper
}
})
}
if (!('title' in rep)) {
if (upper !== null) {
var upperTitle = name
upper.forEach(function (letterId) {
upperTitle = upperTitle.substr(0, letterId) + upperTitle.substr(letterId, 1).toUpperCase() + upperTitle.substr(letterId + 1, upperTitle.length) // fuck IE
})
rep.title = '{%' + upperTitle + '%}'
} else {
rep.title = '{%' + name.toLowerCase().replace(/[a-z]/, function (m) {
return m.toUpperCase() // Repeat dirty code...
}) + '%}'
}
}
if (!('image' in rep)) {
rep.image = name
}
setRetName(ret, rep)
} else if (/QQ(?!Download|Pinyin)/.test(ret.ua)) {
ret.full = getVersion(ret, 'QQ')
ret.image = 'qq'
} else if (/Galaxy/i.test(ret.ua) && !/Chrome/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Galaxy')
ret.image = 'galaxy'
} else if (/Opera Mini/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Opera Mini')
ret.image = 'opera-2'
} else if (/Opera Mobi/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Opera Mobi')
ret.image = 'opera-2'
} else if (/Opera/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Opera')
ret.image = 'opera-1'
if (/Version/i.test(ret.ua)) {
ret.image = 'opera-2'
}
} else if (/OPR/i.test(ret.ua)) {
if (/(Edition Next)/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Opera Next')
ret.image = 'opera-next'
} else if (/(Edition Developer)/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Opera Developer')
ret.image = 'opera-developer'
} else {
ret.full = getVersion(ret, 'Opera')
ret.image = 'opera-1'
}
} else if (/SE /i.test(ret.ua) && /MetaSr/i.test(ret.ua)) {
ret.name = ret.full = 'Sogou Explorer'
ret.image = 'sogou'
} else if (((/Ubuntu; Mobile/i.test(ret.ua) || /Ubuntu; Tablet/i.test(ret.ua)) && /WebKit/i.test(ret.ua))) {
ret.name = ret.full = 'Ubuntu Web Browser'
ret.image = 'ubuntuwebbrowser'
} else if (/Avant Browser/i.test(ret.ua)) { // Fuck it
ret.full = 'Avant ' + getVersion(ret, 'Browser')
ret.image = 'avantbrowser'
} else if (/AppleWebkit/i.test(ret.ua) && /Android/i.test(ret.ua) && !/Chrome/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Android Webkit')
ret.image = 'android-webkit'
} else if (/Windows.+Chrome.+Edge/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Edge')
ret.image = 'edge'
} else if (/Edga/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Edga')
ret.image = 'edge'
} else if (/Chrome|crios/i.test(ret.ua)) {
if (/crios/i.test(ret.ua)) {
ret.full = 'Google ' + getVersion(ret, 'CriOS')
ret.image = 'chrome'
} else {
ret.full = 'Google ' + getVersion(ret, 'Chrome')
ret.image = 'chrome'
}
} else if (/Nokia/i.test(ret.ua) && !/Trident/i.test(ret.ua)) {
ret.full = 'Nokia Web Browser'
ret.image = 'maemo'
} else if (/Safari/i.test(ret.ua)) {
ret.name = 'Safari'
if (/Version/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Safari')
} else {
ret.full = ret.name
}
if (/Mobile ?Safari/i.test(ret.ua)) {
ret.name = 'Mobile ' + ret.name
ret.full = 'Mobile ' + ret.full
}
ret.image = 'safari'
} else if (/Firefox/i.test(ret.ua)) {
ret.full = getVersion(ret, 'Firefox')
ret.image = 'firefox'
} else if (/MSIE/i.test(ret.ua) || /Trident/i.test(ret.ua)) {
ret.full = 'Internet Explorer' + getVersion(ret, 'MSIE')
ret.image = 'msie'
rep = ret.ua.match(/(MSIE[ |/]?| rv:)([.0-9a-zA-Z]+)/i)
if (rep !== null) {
var ieVersion = parseInt(rep[2])
if (ieVersion >= 11) {
ret.image = 'msie11'
} else if (ieVersion >= 10) {
ret.image = 'msie10'
} else if (ieVersion >= 9) {
ret.image = 'msie9'
} else if (ieVersion >= 7) {
ret.image = 'msie7'
} else if (ieVersion >= 6) {
ret.image = 'msie6'
} else if (ieVersion >= 4) {
ret.image = 'msie4'
} else if (ieVersion >= 3) {
ret.image = 'msie3'
} else if (ieVersion >= 2) {
ret.image = 'msie2'
}
}
} else if (/Mozilla/i.test(ret.ua)) {
ret.full = 'Mozilla Compatible'
ret.image = 'mozilla'
} else {
ret.name = 'Unknown'
ret.image = 'null'
ret.full = ret.name
}
return ret
}
/* @covignore */
if (typeof module !== 'undefined' && module.exports) { // Nodejs / Commonjs
module.exports = BROWSER
} else if (typeof define !== 'undefined' && define.amd) { // RequireJS
define([], function () {
return BROWSER
})
} else if (typeof define !== 'undefined' && define.cmd) { // SeaJS
define([], function (require, exports, module) {
module.exports = BROWSER
})
} else { // Direct
root.USERAGENT_BROWSER = function () {}
root.USERAGENT_BROWSER.prototype.analyze = BROWSER.analyze
}
})(this)
;
(function (root) {
var deviceList = [{
regEx: /MEIZU (MX|M9)|MX[0-9]{0,1}[; ]|M0(4|5)\d|M35\d|M\d note/i,
brand: 'Meizu',
image: 'meizu',
childItem: [{
regEx: /(M(04|05|35)\d)/i,
model: '$1'
}, {
regEx: /(MX[0-9]{0,1})/i,
model: '$1'
}, {
regEx: /(m\d Note)/i,
model: '$1'
}]
}, {
regEx: /MI-ONE|MI[ -]\d/i,
brand: 'Xiaomi',
image: 'xiaomi',
childItem: [{
regEx: /MI-ONE/i,
model: '1'
}, {
regEx: /MI[ -]([A-Z0-9]+)/i,
model: '$1'
}]
}, {
regEx: /HM NOTE|HM \d|Redmi/i,
brand: 'Redmi',
image: 'xiaomi',
childItem: [{
regEx: /HM NOTE ([A-Z0-9]+)/i,
model: 'Note $1'
}, {
regEx: /HM ([A-Z0-9]+)/i,
model: '$1'
}, {
regEx: /RedMi Note ([A-Z0-9]+)/i,
model: 'Note $1'
}]
}, {
regEx: /BlackBerry/i,
brand: 'BlackBerry',
image: 'blackberry',
version: {
start: 'blackberry ?'
}
}, {
regEx: /Coolpad/i,
brand: 'CoolPad',
image: 'coolpad',
version: {
start: 'CoolPad( |_)?',
item: 2
}
}, {
regEx: /Dell/i,
brand: 'Dell',
image: 'dell',
childItem: [{
regEx: /Dell Streak/i,
model: 'Streak'
}]
}, {
regEx: /Hasee/i,
brand: 'Hasee',
image: 'hasee',
childItem: [{
regEx: /Hasee (([^;/]+) Build|([^;/)]+)[);/ ])/i,
model: '$2'
}]
}, {
regEx: /Hisense|HS-(?:U|EG?|I|T|X)[0-9]+[a-z0-9-]*/i,
brand: 'Hisense',
image: 'hisense',
childItem: [{
regEx: /(HS-(?:U|EG?|I|T|X)[0-9]+[a-z0-9-]*)/i,
model: '$1'
}]
}, {
regEx: /HTC|Desire|Rhodium|WMD-50433/i,
brand: 'HTC',
image: 'htc',
childItem: [{
regEx: /Desire/i,
model: 'Desire'
}, {
regEx: /Rhodium|WMD-50433|HTC[_| ]Touch[_| ]Pro2/i,
model: 'Touch Pro2'
}, {
regEx: /HTC[_| ]Touch[_| ]Pro/i,
model: 'Touch Pro'
}, {
regEx: /Windows Phone .+ by HTC/i,
version: {
start: 'Windows Phone ',
end: ' by HTC'
}
}],
version: {
start: 'HTC[ |_|-]?'
}
}, {
regEx: /huawei|Honor|Che\d|H60-L/i,
brand: 'Huawei',
image: 'huawei',
version: {
start: 'HUAWEI( |_)?',
item: 2
},
childItem: [{
regEx: /HONOR[ ]?([A-Za-z0-9]{3,4}-[A-Za-z0-9]{3,4})|(Che[0-9]{1}-[a-zA-Z0-9]{4})/i,
model: '$1'
}, {
regEx: /(H60-L\d+)/i,
model: '$1'
}]
}, {
regEx: /Kindle/i,
brand: 'Amazon',
model: 'Kindle',
image: 'kindle',
version: {
start: 'Kindle/'
}
}, {
regEx: /K-Touch/i,
brand: 'K-Touch',
image: 'k-touch',
version: {
start: 'k-touch[ _]'
}
}, {
regEx: /Lenovo|lepad|Yoga/i,
brand: 'Lenovo',
image: 'lenovo',
childItem: [{
regEx: 'lepad',
model: 'LePad'
}, {
regEx: /Yoga( Tablet)?[ |-|/|_]([.0-9a-zA-Z]+)/i,
model: 'Yoga $2'
}],
version: {
start: 'Lenovo[ |-|/|_]'
}
}, {
regEx: /Letv/i,
brand: 'Letv',
image: 'letv',
version: {
start: 'Letv[- /]'
}
}, {
regEx: /LG/i,
brand: 'LG',
image: 'lg',
version: {
start: 'LGE?([- /])',
item: 2
}
}, {
regEx: / Droid|XT720|MOT-|MIB|XOOM/i,
brand: 'Motorola',
image: 'motorola',
childItem: [{
regEx: / Droid/i,
model: 'Droid'
}, {
regEx: /MOT-|MIB/i,
version: {
start: 'MOT(O|-)',
item: 2
}
}, {
regEx: /XOOM/i,
model: 'Xoom'
}, {
regEx: /XT720/i,
model: 'XT720'
}]
}, {
regEx: /Microsoft/i,
brand: 'Microsoft',
image: 'microsoft',
childItem: [{
regEx: /Lumia/i,
model: 'Lumia',
version: {
start: '(Lumia )',
item: 2
}
}]
}, {
regEx: /Nintendo/i,
brand: 'Nintendo',
image: 'nintendo',
childItem: [{
regEx: /DSi/,
model: 'DSi',
image: 'nintendodsi'
}, {
regEx: /DS/,
model: 'DS',
image: 'nintendods'
}, {
regEx: /WiiU/,
model: 'Wii U',
image: 'nintendowiiu'
}, {
regEx: /Wii/,
model: 'Wii',
image: 'nintendowii'
}]
}, {
regEx: /Nokia/i,
brand: 'Nokia',
image: 'nokia',
childItem: [{
regEx: /Nokia 909/i,
model: 'Lumia 1020'
}, {
regEx: /IEMobile|WPDesktop|Edge/i,
model: 'Lumia',
version: {
start: '(Nokia |Lumia |Nokia;)',
item: 2
}
}],
version: {
start: 'Nokia',
item: 1
}
}, {
regEx: /Onda/i,
brand: 'Onda',
image: 'onda'
}, {
regEx: /oppo/i,
brand: 'OPPO',
image: 'oppo'
}, {
regEx: /A0001|A2005|A3000|E1003|One [A-Z]\d{4}/i,
brand: 'OnePlus',
image: 'oneplus',
childItem: [{
regEx: /A0001/,
model: '1'
}, {
regEx: /A2005/,
model: '2'
}, {
regEx: /E1003/,
model: 'X'
}, {
regEx: /A3000/,
model: '3'
}]
}, {
regEx: / Pixi\/| Pre\/|Palm|webos/i,
brand: 'Palm',
image: 'palm',
childItem: [{
regEx: /Pixi/i,
model: 'Pixi'
}, {
regEx: /Pre/i,
model: 'Pre'
}]
}, {
regEx: /Galaxy Nexus|Smart-?TV|GT-|SM-|SCH-|SHV-|Samsung/i,
brand: 'Samsung',
image: 'samsung',
childItem: [{
regEx: /Smart-?TV/i,
model: 'Smart TV'
}, {
regEx: /Galaxy Nexus/i,
model: 'Galaxy Nexus'
}],
version: {
start: '(Samsung-(SCH-)?|GT-|SM-|SCH-|SHV-)',
item: 3
}
}, {
regEx: /PlayStation/i,
brand: 'Sony',
model: 'PlayStation',
image: 'playstation',
version: {
start: 'PlayStation '
}
}, {
regEx: /SonyEricsson/i,
brand: 'SonyEricsson',
image: 'sonyericsson',
version: {
start: 'SonyEricsson'
}
}, {
regEx: /TCL/i,
brand: 'TCL',
image: 'tcl',
version: {
start: 'TCL ?'
}
}, {
regEx: /vivo/i,
brand: 'vivo',
image: 'vivo',
version: {
start: 'VIVO '
}
}, {
regEx: /Xperia/i,
brand: 'Sony',
model: 'Xperia',
image: 'xperia',
version: {
start: 'Xperia(-T)?( |_|-)?',
item: 3
}
}, {
regEx: /zte/i,
brand: 'ZTE',
image: 'zte',
version: {
start: 'ZTE '
}
}, {
regEx: /Ubuntu; (Mobile|Tablet)/i,
brand: 'Ubuntu',
image: 'ubuntutouch',
childItem: [{
regEx: /Mobile/i,
model: 'Phone'
}, {
regEx: /Tablet/i,
model: 'Tablet'
}]
}, {
regEx: /Nexus/i,
brand: 'Google',
model: 'Nexus',
image: 'google-nexusone',
version: {
start: 'Nexus '
}
}]
var analyzeVersion = function (ret, deviceItem) {
if (!('end' in deviceItem.version)) deviceItem.version.end = ''
if (!('item' in deviceItem.version)) deviceItem.version.item = 1
var versionRegEx = new RegExp(deviceItem.version.start + '([.0-9a-zA-Z]+)' + deviceItem.version.end, 'i')
var rep = ret.ua.match(versionRegEx)
if (rep) {
ret.model += (ret.model === '' ? '' : ' ') + rep[deviceItem.version.item].replace(/_/g, '')
// ret.addChild = false; // If it has some supplementary name then do not check child.
}
}
var analyzeItem = function (ret, deviceList) {
var rep = null
var fixedName = ''
var deviceItem = null
var deviceKeys = Object.keys(deviceList)
for (var i = 0; i < deviceKeys.length; i++) {
deviceItem = deviceList[deviceKeys[i]]
if (!(rep = ret.ua.match(deviceItem.regEx))) continue
var deviceItems = Object.keys(deviceItem)
for (var j = 0; j < deviceItems.length; j++) {
var singleName = deviceItems[j]
var singleItem = deviceItem[singleName]
switch (singleName) {
case 'childItem':
case 'version':
case 'regEx':
// Do nothing..
break
case 'brand':
case 'model':
if (rep.length === 0) continue // Didn't match
if (ret[singleName] !== '') {
ret[singleName] += ' '
}
fixedName = singleItem
for (var k = 1; k < rep.length; k++) { // rep[0] is useless
fixedName = fixedName.replace(new RegExp('\\$' + k, 'g'), rep[k])
}
ret[singleName] += fixedName
break
default:
ret[singleName] = singleItem
break
}
}
var checkVersionSwitch = ('version' in deviceItem)
if ('childItem' in deviceItem) {
if (analyzeItem(ret, deviceItem.childItem)) {
checkVersionSwitch = false
}
}
if (checkVersionSwitch) {
analyzeVersion(ret, deviceItem)
}
delete ret.addVersion
return true
}
return false
}
var analyze = function (ret) {
if (analyzeItem(ret, deviceList)) {
// Do nothing
}
// Apple
else if (/iPad/i.test(ret.ua)) {
ret.brand = 'Apple'
ret.model = 'iPad'
ret.image = 'ipad'
} else if (/iPod/i.test(ret.ua)) {
ret.brand = 'Apple'
ret.model = 'iPod'
ret.image = 'iphone'
} else if (/iPhone/i.test(ret.ua)) {
ret.brand = 'Apple'
ret.model = 'iPhone'
ret.image = 'iphone'
}
else if (/MSIE.+?Windows.+?Trident/i.test(ret.ua) && !/Windows ?Phone/i.test(ret.ua)) { // is MSIE
ret.brand = ''
ret.model = ''
ret.image = 'null'
}
else {
ret.image = 'null'
}
}
var DEVICE = {}
DEVICE.analyze = function (uaString) {
var ret = {
'ua': uaString,
'name': '',
'image': '',
'brand': '',
'model': '',
'dir': 'device'
}
analyze(ret)
ret.name = ret.brand === '' && ret.model === '' ? '' : ret.brand + (ret.model === '' ? '' : ' ') + ret.model
ret.full = ret.name
return ret
}
/* @covignore */
if (typeof module !== 'undefined' && module.exports) { // Nodejs / Commonjs
module.exports = DEVICE
} else if (typeof define !== 'undefined' && define.amd) { // RequireJS
define([], function () {
return DEVICE
})
} else if (typeof define !== 'undefined' && define.cmd) { // SeaJS
define([], function (require, exports, module) {
module.exports = DEVICE
})
} else { // Direct
root.USERAGENT_DEVICE = function () {}
root.USERAGENT_DEVICE.prototype.analyze = DEVICE.analyze
}
})(this)
;
(function (root) {
var windowsVersion = {
'6.4': ['10', '6'], // Windows 10 before 10240
'10.0': ['10', '6'],
'6.3': ['8.1', '5'],
'6.2': ['8', '5'],
'6.1': ['7', '4'],
'6.0': ['Vista', '3'],
'5.2': ['Server 2003', '2'],
'5.1': ['XP', '2'],
'5.01': ['2000 Service Pack 1', '1'],
'5.0': ['2000', '1'],
'4.0': ['NT 4.0', '1'],
'3.51': ['NT 3.11', '1']
}
var osRegEx = new RegExp([
'BB10', 'BeOS', 'DragonFly', 'FreeBSD', 'Inferno',
'SunOS', 'Solaris', 'J2ME/MIDP',
'MorphOS', 'NetBSD', 'OpenBSD', 'Unix', 'webOS'
].join('|'), 'i')
var defaultOSList = {
bb10: {
name: 'BlackBerry OS 10',
image: 'blackberry'
},
dragonfly: {
name: 'DragonFly BSD',
image: 'dragonflybsd'
},
freebsd: {
name: 'FreeBSD'
},
morphos: {
name: 'MorphOS'
},
openbsd: {
name: 'OpenBSD'
},
netbsd: {
name: 'NetBSD'
},
beos: {
name: 'BeOS'
},
webos: {
name: 'Palm webOS',
image: 'palm'
},
sunos: {
name: 'Solaris',
image: 'solaris'
},
'j2me/midp': {
name: 'J2ME/MIDP Device',
image: 'java'
}
}
var linuxRegEx = new RegExp([
'Arch ?Linux', 'Chakra', 'Crunchbang', 'Debian', 'Gentoo', 'Kanotix', 'Knoppix', 'Jolla',
'LindowsOS', 'Linspire', 'Mageia', 'Pardus', 'Rosa', 'Sabayon',
'Slackware', 'Suse', 'VectorLinux', 'Venenux', 'Xandros', 'Zenwalk'
].join('|'), 'i')
var defaultLinuxList = {
'arch linux': {
image: 'archlinux',
name: 'Arch Linux'
},
archlinux: {
name: 'Arch Linux'
},
suse: {
name: 'openSUSE'
},
lindowsos: {
name: 'LindowsOS'
},
linspire: {
image: 'lindowsos'
}
}
var linuxWithVersion = {
'centos': ['centos', /.el([.0-9a-zA-Z]+).centos/i],
'fedora': ['fedora', /.fc([.0-9a-zA-Z]+)/i],
'foresight linux': ['foresight', /Foresight Linux\/([.0-9a-zA-Z]+)/i],
'linux mint': ['linuxmint', /Linux Mint\/([.0-9a-zA-Z]+)/i],
'mandriva': ['mandriva', /mdv\/([.0-9a-zA-Z]+)/i],
'moonos': ['moonos', /moonos\/([.0-9a-zA-Z]+)/i]
}
var linuxWithVersionRegEx = new RegExp('(' + Object.keys(linuxWithVersion).join('|') + ')', 'i')
var returnWindows = function (ret, version) {
ret.full += ' ' + windowsVersion[version][0]
ret.image = 'win-' + windowsVersion[version][1]
ret.version = version
}
var analyzeWindows = function (ret) {
ret.full = 'Windows'
ret.name = 'Windows'
ret.image = 'win-2'
ret.version = ''
var rep = null
if (/Windows Phone|WPDesktop|ZuneWP7|WP7/i.test(ret.ua)) {
ret.name += ' Phone'
ret.image = 'windowsphone'
rep = ret.ua.match(/Windows Phone (OS )?([0-9.]+)/i)
if (rep !== null) {
ret.version = rep[2]
var intVersion = parseInt(ret.version)
if (intVersion === 7) {
ret.image = 'wp7'
} else if (intVersion === 10) {
ret.name = 'Windows'
ret.version = '10 Mobile'
ret.image = 'win-6'
}
}
ret.full = ret.name + (ret.version === '' ? '' : ' ' + ret.version)
} else if (/Windows NT/i.test(ret.ua)) {
ret.name = 'Windows NT'
rep = ret.ua.match(/Windows NT (\d+\.\d+)/i)
if (rep !== null) {
if (windowsVersion[rep[1]]) {
returnWindows(ret, rep[1])
}
}
}
if (ret.full !== 'Windows') {
return true
}
if (/Windows XP/i.test(ret.ua)) {
returnWindows(ret, '5.1')
} else if (/Windows 2000/i.test(ret.ua)) {
returnWindows(ret, '5.0')
} else if (/WinNT4.0/i.test(ret.ua)) {
returnWindows(ret, '4.0')
} else if (/WinNT3.51/i.test(ret.ua)) {
returnWindows(ret, '3.51')
} else if (/Win(dows )?3.11|Win16/i.test(ret.ua)) {
ret.full += ' 3.11'
ret.image = 'win-1'
} else if (/Windows 3.1/i.test(ret.ua)) {
ret.full += ' 3.1'
ret.image = 'win-1'
} else if (/Win 9x 4.90|Windows ME/i.test(ret.ua)) {
ret.full += ' Me'
ret.image = 'win-1'
} else if (/Win98/i.test(ret.ua)) {
ret.full += ' 98 SE'
ret.image = 'win-1'
} else if (/Windows (98|4\.10)/i.test(ret.ua)) {
ret.full += ' 98'
ret.image = 'win-1'
} else if (/Windows 95/i.test(ret.ua) || /Win95/i.test(ret.ua)) {
ret.full += ' 95'
ret.image = 'win-1'
} else if (/Windows CE|Windows .+Mobile/i.test(ret.ua)) {
ret.full += ' CE'
ret.image = 'win-2'
// #JSCOVERAGE_IF false
} else if (/WM5/i.test(ret.ua)) {
ret.name += ' Mobile'
ret.version = '5'
ret.full = ret.name + ' ' + ret.version
ret.image = 'win-phone'
// #JSCOVERAGE_ENDIF
} else if (/WindowsMobile/i.test(ret.ua)) {
ret.name += ' Mobile'
ret.full = ret.name
ret.image = 'win-phone'
}
}
var analyzeLinux = function (ret) {
ret.name = ''
ret.image = ''
ret.version = ''
var rep = null
var res = ret.ua.match(linuxRegEx)
var name = ''
linuxWithVersionRegEx.lastIndex = 0
if (res !== null) {
name = res[0].toLowerCase()
ret.name = name.replace(/(\w)/, function (string) {
return string.toUpperCase()
})
ret.image = name
if (defaultLinuxList[name]) {
ret.name = defaultLinuxList[name].name || ret.name
ret.image = defaultLinuxList[name].image || ret.image
}
} else if (/(L|K|X|Ed)?Ubuntu/i.test(ret.ua)) { // The count of Ubuntu users is more than others.
ret.name = 'Ubuntu'
rep = ret.ua.match(/Ubuntu[/| ]([.0-9]+[.0-9a-zA-Z]+)/i)
if (rep) {
ret.version = rep[1]
if (parseInt(ret.version) < 10) {
ret.image = 'ubuntu-1'
}
}
if (ret.image === '') {
ret.image = 'ubuntu-2'
}
rep = ret.ua.match(/(L|K|X|Ed)Ubuntu/i)
if (rep) {
var childUbuntuVersion = rep[1].toLowerCase()
ret.name = childUbuntuVersion + ret.name
ret.name = ret.name.toLowerCase().replace(/(\w)/, function (m) {
return m.toUpperCase()
})
ret.image = childUbuntuVersion + ret.image
}
} else if (linuxWithVersionRegEx.test(ret.ua)) {
rep = ret.ua.match(linuxWithVersionRegEx)
name = rep[1].toLowerCase()
ret.name = rep[1]
rep = ret.ua.match(linuxWithVersion[name][1])
if (rep) {
ret.version = rep[1]
}
ret.image = linuxWithVersion[name][0]
} else if (/Red Hat/i.test(ret.ua) || /RedHat/i.test(ret.ua)) {
ret.name = 'Red Hat'
rep = ret.ua.match(/.el([._0-9a-zA-Z]+)/i)
if (rep) {
ret.name += ' Enterprise Linux'
ret.version = rep[1].replace(/_/g, '.')
}
ret.image = 'red-hat'
} else {
ret.name = 'GNU/Linux'
ret.image = 'linux'
}
ret.full = ret.name
if (ret.version !== '') {
ret.full += ' ' + ret.version
}
}
var analyzeOther = function (ret) {
ret.name = ''
ret.image = ''
ret.version = ''
ret.full = ''
var res = ret.ua.match(osRegEx)
var rep
if (res !== null) {
var name = res[0].toLowerCase()
ret.name = name.replace(/(\w)/, function (string) {
return string.toUpperCase()
})
ret.image = name
if (defaultOSList[name]) {
ret.name = defaultOSList[name].name || ret.name
ret.image = defaultOSList[name].image || ret.image
}
}
// Opera's Useragent does not contains 'Linux'
else if (/Android|ADR /i.test(ret.ua)) {
ret.name = 'Android'
ret.image = 'android'
rep = ret.ua.match(/(Android|Adr)[ |/]([.0-9]+)/i)
if (rep) {
ret.version = rep[2]
}
} else if (/Tizen/i.test(ret.ua)) {
ret.name = 'Tizen'
ret.image = 'tizen'
} else if (/(iPhone|CPU) OS/.test(ret.ua)) {
ret.name = 'iOS'
ret.image = 'mac-3'
rep = ret.ua.match(/(iPhone|CPU) OS ([._0-9]+)/i)
if (rep) {
ret.version = rep[2].replace(/_/g, '.')
}
} else if (/AmigaOS/i.test(ret.ua)) {
ret.name = 'AmigaOS'
rep = ret.ua.match(/AmigaOS ([.0-9a-zA-Z]+)/i)
if (rep) {
ret.version = rep[1]
}
ret.image = 'amigaos'
} else if (/\b(?!Mi)CrOS(?!oft)/i.test(ret.ua)) {
ret.name = 'Google Chrome OS'
ret.image = 'chromeos'
} else if (/IRIX/i.test(ret.ua)) {
ret.name = 'IRIX'
rep = ret.ua.match(/IRIX(64)? ([.0-9a-zA-Z]+)/i)
if (rep) {
if (rep[1] !== undefined && rep[1] !== '') {
ret.x64 = true
}
if (rep[2] !== undefined && rep[2] !== '') {
ret.version = rep[2]
}
}
ret.image = 'irix'
} else if (/Mac/i.test(ret.ua) || /Darwin/i.test(ret.ua)) {
rep = ret.ua.match(/(Mac OS ?X)/i)
if (rep) {
ret.version = ret.ua.substr(ret.ua.toLowerCase().indexOf(rep[1].toLowerCase()))
ret.version = ret.version.substr(0, ret.version.indexOf(')'))
if (ret.version.indexOf(';') > 0) {
ret.version = ret.version.substr(0, ret.version.indexOf(';'))
}
ret.version = ret.version.replace(/_/g, '.')
ret.version = ret.version.replace(/Mac OS ?X ?/, '')
var macVersionArray = ret.version.split('.')
if (macVersionArray.length > 1) {
var macMainVersion = parseInt(macVersionArray[0])
var macSubVersion = parseInt(macVersionArray[1])
if (macMainVersion >= 10 && macSubVersion >= 12) {
ret.name = 'macOS'
}
}
if (ret.name === '') {
ret.name = 'Mac OS X'
}
ret.full = ret.name + ' ' + ret.version
ret.image = rep[1] === 'Mac OSX' ? 'mac-2' : 'mac-3'
} else if (/Darwin/i.test(ret.ua)) {
ret.name = 'Mac OS Darwin'
ret.image = 'mac-1'
} else {
ret.name = 'Macintosh'
ret.image = 'mac-1'
}
} else if (/Meego/i.test(ret.ua)) {
ret.name = 'Meego'
ret.image = 'meego'
} else if (/RISC OS/i.test(ret.ua)) {
ret.name = 'RISC OS'
ret.image = 'risc'
rep = ret.ua.match(/RISC OS ([.0-9a-zA-Z]+)/i)
if (rep) {
ret.version = rep[1]
}
} else if (/Symb(ian)?(OS)?/i.test(ret.ua)) {
ret.name = 'SymbianOS'
rep = ret.ua.match(/Symb(ian)?(OS)?\/([.0-9a-zA-Z]+)/i)
if (rep) {
ret.version = rep[3]
}
ret.image = 'symbian'
} else {
ret.name = 'Unknown'
ret.image = 'null'
}
ret.full = ret.name + (ret.version === '' ? '' : ' ' + ret.version)
}
var OS = {}
OS.analyze = function (uaString) {
var ret = {
ua: uaString,
name: '',
version: '',
full: '',
windows: false,
linux: false,
x64: false,
dir: 'os'
}
if (/x86_64|Win64; x64|WOW64/i.test(ret.ua)) {
ret.x64 = true
}
if (/Windows|Win(NT|32|95|98|16)|ZuneWP7|WPDesktop/i.test(ret.ua)) {
ret.windows = true
analyzeWindows(ret)
} else if (/Linux/i.test(ret.ua) && !/Android|ADR|Tizen/.test(ret.ua)) {
ret.linux = true
analyzeLinux(ret)
} else {
analyzeOther(ret)
}
if (ret.full === '') {
ret.full = ret.name
}
if (ret.x64) {
ret.full += ' x64'
}
return ret
}
/* @covignore */
if (typeof module !== 'undefined' && module.exports) { // Nodejs / Commonjs
module.exports = OS
} else if (typeof define !== 'undefined' && define.amd) { // RequireJS
define([], function () {
return OS
})
} else if (typeof define !== 'undefined' && define.cmd) { // SeaJS
define([], function (require, exports, module) {
module.exports = OS
})
} else { // Direct
root.USERAGENT_OS = function () {}
root.USERAGENT_OS.prototype.analyze = OS.analyze
}
})(this)
/* global USERAGENT_OS */
/* global USERAGENT_DEVICE */
/* global USERAGENT_BROWSER */
;
(function (root) {
var CommonJS = typeof module !== 'undefined' && module.exports
var CMD = typeof define !== 'undefined' && define.cmd
var AMD = typeof define !== 'undefined' && define.amd
var userAgent = {}
userAgent.analyze = function (uaString) {
var returnObject = {}
returnObject.ua = uaString
if (this.osDetect) returnObject.os = this.osDetect.analyze(uaString)
if (this.deviceDetect) returnObject.device = this.deviceDetect.analyze(uaString)
if (this.browserDetect) returnObject.browser = this.browserDetect.analyze(uaString)
if (returnObject.device) returnObject.platform = returnObject.device
if (returnObject.device && returnObject.os && returnObject.device.name === '') returnObject.platform = returnObject.os
return returnObject
}
var requireFunction = function (userAgent, OS, DEVICE, BROWSER) {
userAgent.osDetect = OS
userAgent.deviceDetect = DEVICE
userAgent.browserDetect = BROWSER
}
if (CommonJS) {
if (process.env.UAJS_COV) {
var libs = ['-cov/os', '-cov/device', '-cov/browser'] // To prevent webpack pack lib-cov.
requireFunction(userAgent, require('./lib' + libs[0]), require('./lib' + libs[1]), require('./lib' + libs[2]))
} else {
requireFunction(userAgent, require('./lib/os'), require('./lib/device'), require('./lib/browser'))
}
module.exports = userAgent
}
else if (AMD) {
define(['./lib/os', './lib/device', './lib/browser'], function (OS, DEVICE, BROWSER) {
requireFunction(userAgent, OS, DEVICE, BROWSER)
return userAgent
})
}
else if (CMD) {
define(function (require, exports, module) {
requireFunction(userAgent, require('./lib/os'), require('./lib/device'), require('./lib/browser'))
module.exports = userAgent
})
} else {
if (typeof USERAGENT_OS !== 'undefined') userAgent.osDetect = new USERAGENT_OS()
if (typeof USERAGENT_DEVICE !== 'undefined') userAgent.deviceDetect = new USERAGENT_DEVICE()
if (typeof USERAGENT_BROWSER !== 'undefined') userAgent.browserDetect = new USERAGENT_BROWSER()
root.USERAGENT = userAgent
}
})(this)