1161 lines
35 KiB
JavaScript
1161 lines
35 KiB
JavaScript
/* *******************************************
|
|
// Copyright 2010-2015, Anthony Hand
|
|
//
|
|
// BETA NOTICE
|
|
// Previous versions of the JavaScript code for MobileESP were 'regular'
|
|
// JavaScript. The strength of it was that it was really easy to code and use.
|
|
// Unfortunately, regular JavaScript means that all variables and functions
|
|
// are in the global namespace. There can be collisions with other code libraries
|
|
// which may have similar variable or function names. Collisions cause bugs as each
|
|
// library changes a variable's definition or functionality unexpectedly.
|
|
// As a result, we thought it wise to switch to an "object oriented" style of code.
|
|
// This 'literal notation' technique keeps all MobileESP variables and functions fully self-contained.
|
|
// It avoids potential for collisions with other JavaScript libraries.
|
|
// This technique allows the developer continued access to any desired function or property.
|
|
//
|
|
// Please send feedback to project founder Anthony Hand: anthony.hand@gmail.com
|
|
//
|
|
//
|
|
// File version 2015.05.13 (May 13, 2015)
|
|
// Updates:
|
|
// - Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
|
|
// - Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet.
|
|
// - Removed DetectOperaAndroidPhone(). This method is no longer reliable.
|
|
// - Removed DetectOperaAndroidTablet(). This method is no longer reliable.
|
|
// - Added support for Windows Phone 10: variable and DetectWindowsPhone10()
|
|
// - Updated DetectWindowsPhone() to include WP10.
|
|
// - Added support for Firefox OS.
|
|
// - A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
|
|
// - NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
|
|
// - Added support for Sailfish OS. Not enough info to add a tablet detection method at this time.
|
|
// - A variable plus DetectSailfish(), DetectSailfishPhone()
|
|
// - Added support for Ubuntu Mobile OS.
|
|
// - DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
|
|
// - Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps.
|
|
// - One variable for Samsung Tizen TVs, plus DetectTizenTV()
|
|
// - One variable for LG WebOS TVs, plus DetectWebOSTV()
|
|
// - Updated DetectTizen(). Now tests for “mobile” to disambiguate from Samsung Smart TVs
|
|
// - Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
|
|
// - Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet.
|
|
// - Updated DetectAndroidPhone().
|
|
// - Updated internal detection code for Android.
|
|
// - No longer has a special test case for the HTC Flyer tablet.
|
|
// - Checks against DetectOperaMobile() on Android and reports here if relevant.
|
|
// - Updated DetectAndroidTablet().
|
|
// - No longer has a special test case for the HTC Flyer tablet.
|
|
// - Checks against DetectOperaMobile() on Android to exclude it from here.
|
|
// - DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones.
|
|
// - DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.
|
|
// - DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile.
|
|
// - DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile.
|
|
// - DetectSmartphone(): Added support for Meego phones.
|
|
// - Reorganized DetectMobileQuick(). Moved the following to DetectMobileLong():
|
|
// - DetectDangerHiptop(), DetectMaemoTablet(), DetectSonyMylo(), DetectArchos()
|
|
//
|
|
//
|
|
//
|
|
// LICENSE INFORMATION
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
// either express or implied. See the License for the specific
|
|
// language governing permissions and limitations under the License.
|
|
//
|
|
//
|
|
// ABOUT THIS PROJECT
|
|
// Project Owner: Anthony Hand
|
|
// Email: anthony.hand@gmail.com
|
|
// Web Site: http://www.mobileesp.com
|
|
// Source Files: https://github.com/ahand/mobileesp
|
|
//
|
|
// Versions of this code are available for:
|
|
// PHP, JavaScript, Java, ASP.NET (C#), Ruby and others
|
|
//
|
|
//
|
|
// WARNING:
|
|
// These JavaScript-based device detection features may ONLY work
|
|
// for the newest generation of smartphones, such as the iPhone,
|
|
// Android and Palm WebOS devices.
|
|
// These device detection features may NOT work for older smartphones
|
|
// which had poor support for JavaScript, including
|
|
// older BlackBerry, PalmOS, and Windows Mobile devices.
|
|
// Additionally, because JavaScript support is extremely poor among
|
|
// 'feature phones', these features may not work at all on such devices.
|
|
// For better results, consider using a server-based version of this code,
|
|
// such as Java, APS.NET, PHP, or Ruby.
|
|
//
|
|
// *******************************************
|
|
*/
|
|
|
|
|
|
var MobileEsp = {
|
|
|
|
//GLOBALLY USEFUL VARIABLES
|
|
//Note: These values are set automatically during the Init function.
|
|
//Stores whether we're currently initializing the most popular functions.
|
|
initCompleted : false,
|
|
isWebkit : false, //Stores the result of DetectWebkit()
|
|
isMobilePhone : false, //Stores the result of DetectMobileQuick()
|
|
isIphone : false, //Stores the result of DetectIphone()
|
|
isAndroid : false, //Stores the result of DetectAndroid()
|
|
isAndroidPhone : false, //Stores the result of DetectAndroidPhone()
|
|
isTierTablet : false, //Stores the result of DetectTierTablet()
|
|
isTierIphone : false, //Stores the result of DetectTierIphone()
|
|
isTierRichCss : false, //Stores the result of DetectTierRichCss()
|
|
isTierGenericMobile : false, //Stores the result of DetectTierOtherPhones()
|
|
|
|
//INTERNALLY USED DETECTION STRING VARIABLES
|
|
engineWebKit : 'webkit',
|
|
deviceIphone : 'iphone',
|
|
deviceIpod : 'ipod',
|
|
deviceIpad : 'ipad',
|
|
deviceMacPpc : 'macintosh', //Used for disambiguation
|
|
|
|
deviceAndroid : 'android',
|
|
deviceGoogleTV : 'googletv',
|
|
|
|
deviceWinPhone7 : 'windows phone os 7',
|
|
deviceWinPhone8 : 'windows phone 8',
|
|
deviceWinPhone10 : 'windows phone 10',
|
|
deviceWinMob : 'windows ce',
|
|
deviceWindows : 'windows',
|
|
deviceIeMob : 'iemobile',
|
|
devicePpc : 'ppc', //Stands for PocketPC
|
|
enginePie : 'wm5 pie', //An old Windows Mobile
|
|
|
|
deviceBB : 'blackberry',
|
|
deviceBB10 : 'bb10', //For the new BB 10 OS
|
|
vndRIM : 'vnd.rim', //Detectable when BB devices emulate IE or Firefox
|
|
deviceBBStorm : 'blackberry95', //Storm 1 and 2
|
|
deviceBBBold : 'blackberry97', //Bold 97x0 (non-touch)
|
|
deviceBBBoldTouch : 'blackberry 99', //Bold 99x0 (touchscreen)
|
|
deviceBBTour : 'blackberry96', //Tour
|
|
deviceBBCurve : 'blackberry89', //Curve 2
|
|
deviceBBCurveTouch : 'blackberry 938', //Curve Touch 9380
|
|
deviceBBTorch : 'blackberry 98', //Torch
|
|
deviceBBPlaybook : 'playbook', //PlayBook tablet
|
|
|
|
deviceSymbian : 'symbian',
|
|
deviceSymbos : 'symbos', //Opera 10 on Symbian
|
|
deviceS60 : 'series60',
|
|
deviceS70 : 'series70',
|
|
deviceS80 : 'series80',
|
|
deviceS90 : 'series90',
|
|
|
|
devicePalm : 'palm',
|
|
deviceWebOS : 'webos', //For Palm devices
|
|
deviceWebOStv : 'web0s', //For LG TVs
|
|
deviceWebOShp : 'hpwos', //For HP's line of WebOS devices
|
|
|
|
deviceNuvifone : 'nuvifone', //Garmin Nuvifone
|
|
deviceBada : 'bada', //Samsung's Bada OS
|
|
deviceTizen : 'tizen', //Tizen OS
|
|
deviceMeego : 'meego', //Meego OS
|
|
deviceSailfish : 'sailfish', //Sailfish OS
|
|
deviceUbuntu : 'ubuntu', //Ubuntu Mobile OS
|
|
|
|
deviceKindle : 'kindle', //Amazon eInk Kindle
|
|
engineSilk : 'silk-accelerated', //Amazon's accelerated Silk browser for Kindle Fire
|
|
|
|
engineBlazer : 'blazer', //Old Palm browser
|
|
engineXiino : 'xiino',
|
|
|
|
//Initialize variables for mobile-specific content.
|
|
vndwap : 'vnd.wap',
|
|
wml : 'wml',
|
|
|
|
//Initialize variables for random devices and mobile browsers.
|
|
//Some of these may not support JavaScript
|
|
deviceTablet : 'tablet',
|
|
deviceBrew : 'brew',
|
|
deviceDanger : 'danger',
|
|
deviceHiptop : 'hiptop',
|
|
devicePlaystation : 'playstation',
|
|
devicePlaystationVita : 'vita',
|
|
deviceNintendoDs : 'nitro',
|
|
deviceNintendo : 'nintendo',
|
|
deviceWii : 'wii',
|
|
deviceXbox : 'xbox',
|
|
deviceArchos : 'archos',
|
|
|
|
engineFirefox : 'firefox', //For Firefox OS
|
|
engineOpera : 'opera', //Popular browser
|
|
engineNetfront : 'netfront', //Common embedded OS browser
|
|
engineUpBrowser : 'up.browser', //common on some phones
|
|
deviceMidp : 'midp', //a mobile Java technology
|
|
uplink : 'up.link',
|
|
engineTelecaQ : 'teleca q', //a modern feature phone browser
|
|
engineObigo : 'obigo', //W 10 is a modern feature phone browser
|
|
|
|
devicePda : 'pda',
|
|
mini : 'mini', //Some mobile browsers put 'mini' in their names
|
|
mobile : 'mobile', //Some mobile browsers put 'mobile' in their user agent strings
|
|
mobi : 'mobi', //Some mobile browsers put 'mobi' in their user agent strings
|
|
|
|
//Smart TV strings
|
|
smartTV1 : 'smart-tv', //Samsung Tizen smart TVs
|
|
smartTV2 : 'smarttv', //LG WebOS smart TVs
|
|
|
|
//Use Maemo, Tablet, and Linux to test for Nokia's Internet Tablets.
|
|
maemo : 'maemo',
|
|
linux : 'linux',
|
|
mylocom2 : 'sony/com', // for Sony Mylo 1 and 2
|
|
|
|
//In some UserAgents, the only clue is the manufacturer
|
|
manuSonyEricsson : 'sonyericsson',
|
|
manuericsson : 'ericsson',
|
|
manuSamsung1 : 'sec-sgh',
|
|
manuSony : 'sony',
|
|
manuHtc : 'htc', //Popular Android and WinMo manufacturer
|
|
|
|
//In some UserAgents, the only clue is the operator
|
|
svcDocomo : 'docomo',
|
|
svcKddi : 'kddi',
|
|
svcVodafone : 'vodafone',
|
|
|
|
//Disambiguation strings.
|
|
disUpdate : 'update', //pda vs. update
|
|
|
|
//Holds the User Agent string value.
|
|
uagent : '',
|
|
|
|
//Initializes key MobileEsp variables
|
|
InitDeviceScan : function() {
|
|
this.initCompleted = false;
|
|
|
|
if (navigator && navigator.userAgent)
|
|
this.uagent = navigator.userAgent.toLowerCase();
|
|
|
|
//Save these properties to speed processing
|
|
this.isWebkit = this.DetectWebkit();
|
|
this.isIphone = this.DetectIphone();
|
|
this.isAndroid = this.DetectAndroid();
|
|
this.isAndroidPhone = this.DetectAndroidPhone();
|
|
|
|
//Generally, these tiers are the most useful for web development
|
|
this.isMobilePhone = this.DetectMobileQuick();
|
|
this.isTierIphone = this.DetectTierIphone();
|
|
this.isTierTablet = this.DetectTierTablet();
|
|
|
|
//Optional: Comment these out if you NEVER use them
|
|
this.isTierRichCss = this.DetectTierRichCss();
|
|
this.isTierGenericMobile = this.DetectTierOtherPhones();
|
|
|
|
this.initCompleted = true;
|
|
},
|
|
|
|
|
|
//APPLE IOS
|
|
|
|
//**************************
|
|
// Detects if the current device is an iPhone.
|
|
DetectIphone : function() {
|
|
if (this.initCompleted || this.isIphone)
|
|
return this.isIphone;
|
|
|
|
if (this.uagent.search(this.deviceIphone) > -1)
|
|
{
|
|
//The iPad and iPod Touch say they're an iPhone! So let's disambiguate.
|
|
if (this.DetectIpad() || this.DetectIpod())
|
|
return false;
|
|
//Yay! It's an iPhone!
|
|
else
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an iPod Touch.
|
|
DetectIpod : function() {
|
|
if (this.uagent.search(this.deviceIpod) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an iPhone or iPod Touch.
|
|
DetectIphoneOrIpod : function() {
|
|
//We repeat the searches here because some iPods
|
|
// may report themselves as an iPhone, which is ok.
|
|
if (this.DetectIphone() || this.DetectIpod())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an iPad tablet.
|
|
DetectIpad : function() {
|
|
if (this.uagent.search(this.deviceIpad) > -1 && this.DetectWebkit())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects *any* iOS device: iPhone, iPod Touch, iPad.
|
|
DetectIos : function() {
|
|
if (this.DetectIphoneOrIpod() || this.DetectIpad())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//ANDROID
|
|
|
|
//**************************
|
|
// Detects *any* Android OS-based device: phone, tablet, and multi-media player.
|
|
// Also detects Google TV.
|
|
DetectAndroid : function() {
|
|
if (this.initCompleted || this.isAndroid)
|
|
return this.isAndroid;
|
|
|
|
if ((this.uagent.search(this.deviceAndroid) > -1) || this.DetectGoogleTV())
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a (small-ish) Android OS-based device
|
|
// used for calling and/or multi-media (like a Samsung Galaxy Player).
|
|
// Google says these devices will have 'Android' AND 'mobile' in user agent.
|
|
// Ignores tablets (Honeycomb and later).
|
|
DetectAndroidPhone : function() {
|
|
if (this.initCompleted || this.isAndroidPhone)
|
|
return this.isAndroidPhone;
|
|
|
|
//First, let's make sure we're on an Android device.
|
|
if (!this.DetectAndroid())
|
|
return false;
|
|
|
|
//If it's Android and has 'mobile' in it, Google says it's a phone.
|
|
if (this.uagent.search(this.mobile) > -1)
|
|
return true;
|
|
|
|
//Special check for Android phones with Opera Mobile. They should report here.
|
|
if (this.DetectOperaMobile())
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a (self-reported) Android tablet.
|
|
// Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
|
|
DetectAndroidTablet : function() {
|
|
//First, let's make sure we're on an Android device.
|
|
if (!this.DetectAndroid())
|
|
return false;
|
|
|
|
//Special check for Opera Android Phones. They should NOT report here.
|
|
if (this.DetectOperaMobile())
|
|
return false;
|
|
|
|
//Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
|
|
if (this.uagent.search(this.mobile) > -1)
|
|
return false;
|
|
else
|
|
return true;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an Android OS-based device and
|
|
// the browser is based on WebKit.
|
|
DetectAndroidWebKit : function() {
|
|
if (this.DetectAndroid() && this.DetectWebkit())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a GoogleTV.
|
|
DetectGoogleTV : function() {
|
|
if (this.uagent.search(this.deviceGoogleTV) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is based on WebKit.
|
|
DetectWebkit : function() {
|
|
if (this.initCompleted || this.isWebkit)
|
|
return this.isWebkit;
|
|
|
|
if (this.uagent.search(this.engineWebKit) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//WINDOWS MOBILE AND PHONE
|
|
|
|
// Detects if the current browser is a
|
|
// Windows Phone 7, 8, or 10 device.
|
|
DetectWindowsPhone : function() {
|
|
if (this.DetectWindowsPhone7() ||
|
|
this.DetectWindowsPhone8() ||
|
|
this.DetectWindowsPhone10())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a Windows Phone 7 device (in mobile browsing mode).
|
|
DetectWindowsPhone7 : function() {
|
|
if (this.uagent.search(this.deviceWinPhone7) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a Windows Phone 8 device (in mobile browsing mode).
|
|
DetectWindowsPhone8 : function() {
|
|
if (this.uagent.search(this.deviceWinPhone8) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a Windows Phone 10 device (in mobile browsing mode).
|
|
DetectWindowsPhone10 : function() {
|
|
if (this.uagent.search(this.deviceWinPhone10) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a Windows Mobile device.
|
|
// Excludes Windows Phone 7 and later devices.
|
|
// Focuses on Windows Mobile 6.xx and earlier.
|
|
DetectWindowsMobile : function() {
|
|
if (this.DetectWindowsPhone())
|
|
return false;
|
|
|
|
//Most devices use 'Windows CE', but some report 'iemobile'
|
|
// and some older ones report as 'PIE' for Pocket IE.
|
|
if (this.uagent.search(this.deviceWinMob) > -1 ||
|
|
this.uagent.search(this.deviceIeMob) > -1 ||
|
|
this.uagent.search(this.enginePie) > -1)
|
|
return true;
|
|
//Test for Windows Mobile PPC but not old Macintosh PowerPC.
|
|
if ((this.uagent.search(this.devicePpc) > -1) &&
|
|
!(this.uagent.search(this.deviceMacPpc) > -1))
|
|
return true;
|
|
//Test for Windwos Mobile-based HTC devices.
|
|
if (this.uagent.search(this.manuHtc) > -1 &&
|
|
this.uagent.search(this.deviceWindows) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//BLACKBERRY
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry of some sort.
|
|
// Includes BB10 OS, but excludes the PlayBook.
|
|
DetectBlackBerry : function() {
|
|
if ((this.uagent.search(this.deviceBB) > -1) ||
|
|
(this.uagent.search(this.vndRIM) > -1))
|
|
return true;
|
|
if (this.DetectBlackBerry10Phone())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry 10 OS phone.
|
|
// Excludes tablets.
|
|
DetectBlackBerry10Phone : function() {
|
|
if ((this.uagent.search(this.deviceBB10) > -1) &&
|
|
(this.uagent.search(this.mobile) > -1))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is on a BlackBerry tablet device.
|
|
// Example: PlayBook
|
|
DetectBlackBerryTablet : function() {
|
|
if (this.uagent.search(this.deviceBBPlaybook) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry device AND uses a
|
|
// WebKit-based browser. These are signatures for the new BlackBerry OS 6.
|
|
// Examples: Torch. Includes the Playbook.
|
|
DetectBlackBerryWebKit : function() {
|
|
if (this.DetectBlackBerry() &&
|
|
this.uagent.search(this.engineWebKit) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry Touch
|
|
// device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
|
|
DetectBlackBerryTouch : function() {
|
|
if (this.DetectBlackBerry() &&
|
|
((this.uagent.search(this.deviceBBStorm) > -1) ||
|
|
(this.uagent.search(this.deviceBBTorch) > -1) ||
|
|
(this.uagent.search(this.deviceBBBoldTouch) > -1) ||
|
|
(this.uagent.search(this.deviceBBCurveTouch) > -1) ))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry OS 5 device AND
|
|
// has a more capable recent browser. Excludes the Playbook.
|
|
// Examples, Storm, Bold, Tour, Curve2
|
|
// Excludes the new BlackBerry OS 6 and 7 browser!!
|
|
DetectBlackBerryHigh : function() {
|
|
//Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
|
|
if (this.DetectBlackBerryWebKit())
|
|
return false;
|
|
if ((this.DetectBlackBerry()) &&
|
|
(this.DetectBlackBerryTouch() ||
|
|
this.uagent.search(this.deviceBBBold) > -1 ||
|
|
this.uagent.search(this.deviceBBTour) > -1 ||
|
|
this.uagent.search(this.deviceBBCurve) > -1))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a BlackBerry device AND
|
|
// has an older, less capable browser.
|
|
// Examples: Pearl, 8800, Curve1.
|
|
DetectBlackBerryLow : function() {
|
|
if (this.DetectBlackBerry())
|
|
{
|
|
//Assume that if it's not in the High tier or has WebKit, then it's Low.
|
|
if (this.DetectBlackBerryHigh() || this.DetectBlackBerryWebKit())
|
|
return false;
|
|
else
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//SYMBIAN
|
|
|
|
//**************************
|
|
// Detects if the current browser is the Nokia S60 Open Source Browser.
|
|
DetectS60OssBrowser : function() {
|
|
if (this.DetectWebkit())
|
|
{
|
|
if ((this.uagent.search(this.deviceS60) > -1 ||
|
|
this.uagent.search(this.deviceSymbian) > -1))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is any Symbian OS-based device,
|
|
// including older S60, Series 70, Series 80, Series 90, and UIQ,
|
|
// or other browsers running on these devices.
|
|
DetectSymbianOS : function() {
|
|
if (this.uagent.search(this.deviceSymbian) > -1 ||
|
|
this.uagent.search(this.deviceS60) > -1 ||
|
|
((this.uagent.search(this.deviceSymbos) > -1) &&
|
|
(this.DetectOperaMobile)) || //Opera 10
|
|
this.uagent.search(this.deviceS70) > -1 ||
|
|
this.uagent.search(this.deviceS80) > -1 ||
|
|
this.uagent.search(this.deviceS90) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//WEBOS AND PALM
|
|
|
|
//**************************
|
|
// Detects if the current browser is on a PalmOS device.
|
|
DetectPalmOS : function() {
|
|
//Make sure it's not WebOS first
|
|
if (this.DetectPalmWebOS())
|
|
return false;
|
|
|
|
//Most devices nowadays report as 'Palm',
|
|
// but some older ones reported as Blazer or Xiino.
|
|
if (this.uagent.search(this.devicePalm) > -1 ||
|
|
this.uagent.search(this.engineBlazer) > -1 ||
|
|
this.uagent.search(this.engineXiino) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is on a Palm device
|
|
// running the new WebOS.
|
|
DetectPalmWebOS : function()
|
|
{
|
|
if (this.uagent.search(this.deviceWebOS) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is on an HP tablet running WebOS.
|
|
DetectWebOSTablet : function() {
|
|
if (this.uagent.search(this.deviceWebOShp) > -1 &&
|
|
this.uagent.search(this.deviceTablet) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is on a WebOS smart TV.
|
|
DetectWebOSTV : function() {
|
|
if (this.uagent.search(this.deviceWebOStv) > -1 &&
|
|
this.uagent.search(this.smartTV2) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//OPERA
|
|
|
|
//**************************
|
|
// Detects if the current browser is Opera Mobile or Mini.
|
|
// Note: Older embedded Opera on mobile devices didn't follow these naming conventions.
|
|
// Like Archos media players, they will probably show up in DetectMobileQuick or -Long instead.
|
|
DetectOperaMobile : function() {
|
|
if ((this.uagent.search(this.engineOpera) > -1) &&
|
|
((this.uagent.search(this.mini) > -1 ||
|
|
this.uagent.search(this.mobi) > -1)))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//MISCELLANEOUS DEVICES
|
|
|
|
//**************************
|
|
// Detects if the current device is an Amazon Kindle (eInk devices only).
|
|
// Note: For the Kindle Fire, use the normal Android methods.
|
|
DetectKindle : function() {
|
|
if (this.uagent.search(this.deviceKindle) > -1 &&
|
|
!this.DetectAndroid())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current Amazon device has turned on the Silk accelerated browsing feature.
|
|
// Note: Typically used by the the Kindle Fire.
|
|
DetectAmazonSilk : function() {
|
|
if (this.uagent.search(this.engineSilk) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a
|
|
// Garmin Nuvifone.
|
|
DetectGarminNuvifone : function() {
|
|
if (this.uagent.search(this.deviceNuvifone) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a device running the Bada OS from Samsung.
|
|
DetectBada : function() {
|
|
if (this.uagent.search(this.deviceBada) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a device running the Tizen smartphone OS.
|
|
DetectTizen : function() {
|
|
if (this.uagent.search(this.deviceTizen) > -1 &&
|
|
this.uagent.search(this.mobile) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is on a Tizen smart TV.
|
|
DetectTizenTV : function() {
|
|
if (this.uagent.search(this.deviceTizen) > -1 &&
|
|
this.uagent.search(this.smartTV1) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a device running the Meego OS.
|
|
DetectMeego : function() {
|
|
if (this.uagent.search(this.deviceMeego) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a phone running the Meego OS.
|
|
DetectMeegoPhone : function() {
|
|
if (this.uagent.search(this.deviceMeego) > -1 &&
|
|
this.uagent.search(this.mobi) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a mobile device (probably) running the Firefox OS.
|
|
DetectFirefoxOS : function() {
|
|
if (this.DetectFirefoxOSPhone() || this.DetectFirefoxOSTablet())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a phone (probably) running the Firefox OS.
|
|
DetectFirefoxOSPhone : function() {
|
|
//First, let's make sure we're NOT on another major mobile OS.
|
|
if (this.DetectIos() ||
|
|
this.DetectAndroid() ||
|
|
this.DetectSailfish())
|
|
return false;
|
|
|
|
if ((this.uagent.search(this.engineFirefox) > -1) &&
|
|
(this.uagent.search(this.mobile) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a tablet (probably) running the Firefox OS.
|
|
DetectFirefoxOSTablet : function() {
|
|
//First, let's make sure we're NOT on another major mobile OS.
|
|
if (this.DetectIos() ||
|
|
this.DetectAndroid() ||
|
|
this.DetectSailfish())
|
|
return false;
|
|
|
|
if ((this.uagent.search(this.engineFirefox) > -1) &&
|
|
(this.uagent.search(this.deviceTablet) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a device running the Sailfish OS.
|
|
DetectSailfish : function() {
|
|
if (this.uagent.search(this.deviceSailfish) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a phone running the Sailfish OS.
|
|
DetectSailfishPhone : function() {
|
|
if (this.DetectSailfish() && (this.uagent.search(this.mobile) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
|
|
//**************************
|
|
// Detects a mobile device running the Ubuntu Mobile OS.
|
|
DetectUbuntu : function() {
|
|
if (this.DetectUbuntuPhone() || this.DetectUbuntuTablet())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a phone running the Ubuntu Mobile OS.
|
|
DetectUbuntuPhone : function() {
|
|
if ((this.uagent.search(this.deviceUbuntu) > -1) &&
|
|
(this.uagent.search(this.mobile) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects a tablet running the Ubuntu Mobile OS.
|
|
DetectUbuntuTablet : function() {
|
|
if ((this.uagent.search(this.deviceUbuntu) > -1) &&
|
|
(this.uagent.search(this.deviceTablet) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects the Danger Hiptop device.
|
|
DetectDangerHiptop : function() {
|
|
if (this.uagent.search(this.deviceDanger) > -1 ||
|
|
this.uagent.search(this.deviceHiptop) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current browser is a Sony Mylo device.
|
|
DetectSonyMylo : function() {
|
|
if ((this.uagent.search(this.manuSony) > -1) &&
|
|
((this.uagent.search(this.qtembedded) > -1) ||
|
|
(this.uagent.search(this.mylocom2) > -1)))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is on one of
|
|
// the Maemo-based Nokia Internet Tablets.
|
|
DetectMaemoTablet : function() {
|
|
if (this.uagent.search(this.maemo) > -1)
|
|
return true;
|
|
//For Nokia N810, must be Linux + Tablet, or else it could be something else.
|
|
if ((this.uagent.search(this.linux) > -1) &&
|
|
(this.uagent.search(this.deviceTablet) > -1) &&
|
|
this.DetectWebOSTablet() &&
|
|
!this.DetectAndroid())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an Archos media player/Internet tablet.
|
|
DetectArchos : function() {
|
|
if (this.uagent.search(this.deviceArchos) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is an Internet-capable game console.
|
|
// Includes many handheld consoles.
|
|
DetectGameConsole : function() {
|
|
if (this.DetectSonyPlaystation() ||
|
|
this.DetectNintendo() ||
|
|
this.DetectXbox())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a Sony Playstation.
|
|
DetectSonyPlaystation : function() {
|
|
if (this.uagent.search(this.devicePlaystation) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a handheld gaming device with
|
|
// a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
|
|
DetectGamingHandheld : function() {
|
|
if ((this.uagent.search(this.devicePlaystation) > -1) &&
|
|
(this.uagent.search(this.devicePlaystationVita) > -1))
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a Nintendo game device.
|
|
DetectNintendo : function() {
|
|
if (this.uagent.search(this.deviceNintendo) > -1 ||
|
|
this.uagent.search(this.deviceWii) > -1 ||
|
|
this.uagent.search(this.deviceNintendoDs) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a Microsoft Xbox.
|
|
DetectXbox : function() {
|
|
if (this.uagent.search(this.deviceXbox) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
//**************************
|
|
// Detects whether the device is a Brew-powered device.
|
|
// Note: Limited to older Brew-powered feature phones.
|
|
// Ignores newer Brew versions like MP. Refer to DetectMobileQuick().
|
|
DetectBrewDevice : function() {
|
|
if (this.uagent.search(this.deviceBrew) > -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
|
|
// DEVICE CLASSES
|
|
|
|
//**************************
|
|
// Check to see whether the device is *any* 'smartphone'.
|
|
// Note: It's better to use DetectTierIphone() for modern touchscreen devices.
|
|
DetectSmartphone : function() {
|
|
//Exclude duplicates from TierIphone
|
|
if (this.DetectTierIphone() ||
|
|
this.DetectS60OssBrowser() ||
|
|
this.DetectSymbianOS() ||
|
|
this.DetectWindowsMobile() ||
|
|
this.DetectBlackBerry() ||
|
|
this.DetectMeegoPhone() ||
|
|
this.DetectPalmOS())
|
|
return true;
|
|
|
|
//Otherwise, return false.
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects if the current device is a mobile device.
|
|
// This method catches most of the popular modern devices.
|
|
// Excludes Apple iPads and other modern tablets.
|
|
DetectMobileQuick : function() {
|
|
if (this.initCompleted || this.isMobilePhone)
|
|
return this.isMobilePhone;
|
|
|
|
//Let's exclude tablets.
|
|
if (this.DetectTierTablet())
|
|
return false;
|
|
|
|
//Most mobile browsing is done on smartphones
|
|
if (this.DetectSmartphone())
|
|
return true;
|
|
|
|
//Catch-all for many mobile devices
|
|
if (this.uagent.search(this.mobile) > -1)
|
|
return true;
|
|
|
|
if (this.DetectOperaMobile())
|
|
return true;
|
|
|
|
//We also look for Kindle devices
|
|
if (this.DetectKindle() ||
|
|
this.DetectAmazonSilk())
|
|
return true;
|
|
|
|
if (this.uagent.search(this.deviceMidp) > -1 ||
|
|
this.DetectBrewDevice())
|
|
return true;
|
|
|
|
if ((this.uagent.search(this.engineObigo) > -1) ||
|
|
(this.uagent.search(this.engineNetfront) > -1) ||
|
|
(this.uagent.search(this.engineUpBrowser) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// Detects in a more comprehensive way if the current device is a mobile device.
|
|
DetectMobileLong : function() {
|
|
if (this.DetectMobileQuick())
|
|
return true;
|
|
if (this.DetectGameConsole())
|
|
return true;
|
|
|
|
if (this.DetectDangerHiptop() ||
|
|
this.DetectMaemoTablet() ||
|
|
this.DetectSonyMylo() ||
|
|
this.DetectArchos())
|
|
return true;
|
|
|
|
if ((this.uagent.search(this.devicePda) > -1) &&
|
|
!(this.uagent.search(this.disUpdate) > -1))
|
|
return true;
|
|
|
|
//Detect for certain very old devices with stupid useragent strings.
|
|
if ((this.uagent.search(this.manuSamsung1) > -1) ||
|
|
(this.uagent.search(this.manuSonyEricsson) > -1) ||
|
|
(this.uagent.search(this.manuericsson) > -1) ||
|
|
(this.uagent.search(this.svcDocomo) > -1) ||
|
|
(this.uagent.search(this.svcKddi) > -1) ||
|
|
(this.uagent.search(this.svcVodafone) > -1))
|
|
return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//*****************************
|
|
// For Mobile Web Site Design
|
|
//*****************************
|
|
|
|
//**************************
|
|
// The quick way to detect for a tier of devices.
|
|
// This method detects for the new generation of
|
|
// HTML 5 capable, larger screen tablets.
|
|
// Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
|
|
DetectTierTablet : function() {
|
|
if (this.initCompleted || this.isTierTablet)
|
|
return this.isTierTablet;
|
|
|
|
if (this.DetectIpad() ||
|
|
this.DetectAndroidTablet() ||
|
|
this.DetectBlackBerryTablet() ||
|
|
this.DetectFirefoxOSTablet() ||
|
|
this.DetectUbuntuTablet() ||
|
|
this.DetectWebOSTablet())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// The quick way to detect for a tier of devices.
|
|
// This method detects for devices which can
|
|
// display iPhone-optimized web content.
|
|
// Includes iPhone, iPod Touch, Android, Windows Phone 7 and 8, BB10, WebOS, Playstation Vita, etc.
|
|
DetectTierIphone : function() {
|
|
if (this.initCompleted || this.isTierIphone)
|
|
return this.isTierIphone;
|
|
|
|
if (this.DetectIphoneOrIpod() ||
|
|
this.DetectAndroidPhone() ||
|
|
this.DetectWindowsPhone() ||
|
|
this.DetectBlackBerry10Phone() ||
|
|
this.DetectPalmWebOS() ||
|
|
this.DetectBada() ||
|
|
this.DetectTizen() ||
|
|
this.DetectFirefoxOSPhone() ||
|
|
this.DetectSailfishPhone() ||
|
|
this.DetectUbuntuPhone() ||
|
|
this.DetectGamingHandheld())
|
|
return true;
|
|
|
|
//Note: BB10 phone is in the previous paragraph
|
|
if (this.DetectBlackBerryWebKit() && this.DetectBlackBerryTouch())
|
|
return true;
|
|
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// The quick way to detect for a tier of devices.
|
|
// This method detects for devices which are likely to be
|
|
// capable of viewing CSS content optimized for the iPhone,
|
|
// but may not necessarily support JavaScript.
|
|
// Excludes all iPhone Tier devices.
|
|
DetectTierRichCss : function() {
|
|
if (this.initCompleted || this.isTierRichCss)
|
|
return this.isTierRichCss;
|
|
|
|
//Exclude iPhone and Tablet Tiers and e-Ink Kindle devices
|
|
if (this.DetectTierIphone() ||
|
|
this.DetectKindle() ||
|
|
this.DetectTierTablet())
|
|
return false;
|
|
|
|
//Exclude if not mobile
|
|
if (!this.DetectMobileQuick())
|
|
return false;
|
|
|
|
//If it's a mobile webkit browser on any other device, it's probably OK.
|
|
if (this.DetectWebkit())
|
|
return true;
|
|
|
|
//The following devices are also explicitly ok.
|
|
if (this.DetectS60OssBrowser() ||
|
|
this.DetectBlackBerryHigh() ||
|
|
this.DetectWindowsMobile() ||
|
|
(this.uagent.search(this.engineTelecaQ) > -1))
|
|
return true;
|
|
|
|
else
|
|
return false;
|
|
},
|
|
|
|
//**************************
|
|
// The quick way to detect for a tier of devices.
|
|
// This method detects for all other types of phones,
|
|
// but excludes the iPhone and RichCSS Tier devices.
|
|
// NOTE: This method probably won't work due to poor
|
|
// support for JavaScript among other devices.
|
|
DetectTierOtherPhones : function() {
|
|
if (this.initCompleted || this.isTierGenericMobile)
|
|
return this.isTierGenericMobile;
|
|
|
|
//Exclude iPhone, Rich CSS and Tablet Tiers
|
|
if (this.DetectTierIphone() ||
|
|
this.DetectTierRichCss() ||
|
|
this.DetectTierTablet())
|
|
return false;
|
|
|
|
//Otherwise, if it's mobile, it's OK
|
|
if (this.DetectMobileLong())
|
|
return true;
|
|
|
|
else
|
|
return false;
|
|
}
|
|
|
|
};
|
|
|
|
//Initialize the MobileEsp object
|
|
MobileEsp.InitDeviceScan();
|
|
|
|
|
|
|