Lithium

API Docs for: 0.8.0
Show:

File: src\lithium.browser.js

/**
 * @class Li
 */

/**
 * Browser information. This object has 3 sub-properties: name, version and OS.<br/>
 * Overrides jQuery.browser.
 * You also get three 'is' prefixed boolean properties attached to Li:<br/>
 * 1. for OS (e.g Li.isWindows), 2. for browser vendor (e.g Li.isIE), and 3. vendor+version (e.g Li.isIE8).
 * @property browser
 * @type Object
 * @final
 * @credits Modified code from from http://www.quirksmode.org/js/detect.html.
 */
(function (factory) {
    if (typeof define === "function" && define.amd) {
        define(['./lithium', 'jquery'], factory);
    } else { //global
        factory(window.Li, jQuery);
    }
}(function (Li) {
    var agent = navigator.userAgent.toLowerCase(),
        it, match,
        name, version, OS, OSVersion,
        browserList = [
            [/iemobile.([\d\.]+)/, 'IEMobile'],
            [/msie.([\d\.]+)/, 'IE'],
            [/trident.+rv.([\d\.]+)/, 'IE'],
            [/chrome.([\d\.]+)/, 'Chrome'],
            [/firefox.([\d\.]+)/, 'Firefox'],
            [/version\/([\d\.]+).+?safari/, 'Safari'],
            [/opera.+?version\/([\d\.]+)/, 'Opera'],
            [/rv.([\d\.]+).+?gecko/, 'Gecko'],
            [/applewebkit.([\d\.]+)/, 'WebKit']
        ],
        OSList = [
            [/windows phone os ([\d\.]+)/, "WindowsPhone"],
            [/windows (nt [\d\.]+)/, "Windows"],
            [/mac os x ([\d_]+)/, "Mac"],
            [/android ([\d\.]+)/, "Android"],
            [/linux/, "Linux"],
            [/iphone os ([\d_]+)/, "IPhone"],
            [/ipad.+?os ([\d_]+)/, "IPad"],
            [/blackberry (\d+)/, "BlackBerry"],
            [/symbianos.([\d\.]+)/, "Symbian"]
        ];

    while ((it = browserList.shift())) {
        match = agent.match(it[0]);
        if (match) {
            name = it[1];
            version = match[1];
            break;
        }
    }

    if (name) {
        Li["is" + name] = true;
        if (version) {
            Li["is" + name + parseInt(version, 10)] = true;
        }
    }

    Li.isWebKit = Li.isChrome || Li.isSafari || Li.isWebKit;
    Li.isGecko = Li.isFirefox || Li.isGecko;
    Li.isIOS = Li.isIPhone || Li.isIPad;
    Li.isMobile = Li.isAndroid || Li.isIPhone || Li.isBlackBerry || Li.isWindowsPhone || Li.isSymbian;
    //Detecting ' mobile ' from user agent isn't perfect but good enough.
    //http://stackoverflow.com/questions/5341637/how-do-detect-android-tablets-in-general-useragent
    if ((Li.isAndroid || Li.isBlackBerry) && !(/ mobile /).test(agent)) {
        delete Li.isMobile;
    }

    //TODO: Detect Googlebot
    //TODO: Detect IE compatibility mode

    while ((it = OSList.shift())) {
        match = agent.match(it[0]);
        if (match) {
            OS = it[1];
            if ((OSVersion = match[1])) {
                OSVersion = OSVersion.replace('_', '.');
            }
            break;
        }
    }
    if (OS) {
        Li["is" + OS] = true;
    }

    //Bug that WebKit is being detected as Safari on non-iOS phones/tablets
    if (Li.isSafari && (Li.isAndroid || Li.isBlackBerry || Li.isSymbian)) {
        delete Li.isSafari;
        delete Li["is" + name + parseInt(version, 10)];
        name = 'WebKit';
        version = agent.match(/applewebkit.([\d\.]+)/)[1];
        Li["is" + name + parseInt(version, 10)] = true;
    }

    Li.browser = {
        name: name,
        version: version,
        OS: OS,
        OSVersion: OSVersion
    };

    return Li;
}));