/** * jQBrowser² v1.0.1 - Extend jQuery's browser detection capabilities and implement CSS browser selectors * * http://www.alterform.com/resources/jqbrowser-2 * * Built on the shoulders of (and stolen from :) ) giants: * * John Resig * * Peter-Paul Koch * * Dave Cardwell * * Rafael Lima * * Copyright (c) 2006 Nate Cavanaugh, dual licensed under the MIT and GPL * licenses: * * http://www.opensource.org/licenses/mit-license.php * * http://www.gnu.org/licenses/gpl.txt */ var jQBrowser2 = function() { var add_selectors = true; /** * The following functions and attributes form the internal methods and * state of the jQBrowser² plugin. See the relevant function definition * later in the source for further information. * * Private.browser * Private.version * Private.OS * * Private.aol * Private.camino * Private.firefox * Private.flock * Private.icab * Private.konqueror * Private.mozilla * Private.msie * Private.netscape * Private.opera * Private.safari * * Private.linux * Private.mac * Private.win */ var Private = { // Initially set to 'Unknown', if detected each of these properties will // be updated. 'browser': 'Unknown', 'version': { 'number': undefined, 'string': 'Unknown' }, 'OS': 'Unknown', // Initially set to false, if detected one of the following browsers // will be updated. 'aol': false, 'camino': false, 'firefox': false, 'flock': false, 'icab': false, 'konqueror': false, 'mozilla': false, 'msie': false, 'netscape': false, 'opera': false, 'safari': false, // Initially set to false, if detected one of the following operating // systems will be updated. 'linux': false, 'mac': false, 'win': false }; /** * Loop over the items in 'data' trying to find a browser match with the * test in data[i].browser(). Once found, attempt to determine the * browser version. * * 'name': A string containing the full name of the browser. * 'identifier': By default this is a lowercase version of 'name', but * this can be overwritten by explicitly defining an * 'identifier'. * 'browser': A function that returns a boolean value indicating * whether or not the given browser is detected. * 'version': An optional function that overwrites the default version * testing. Must return the result of a .match(). * * Please note that the order of the data array is important, as some * browsers contain details of others in their navigator.userAgent string. * For example, Flock's contains 'Firefox' so much come before Firefox's * test to avoid false positives. */ for( var i = 0, // counter ua = navigator.userAgent, // the navigator's user agent string ve = navigator.vendor, // the navigator's vendor string data = [ // browser tests and data { // Safari 'name': 'Safari', 'browser': /Apple/.test(ve) }, { // Opera 'name': 'Opera', 'browser': window.opera != undefined }, { // iCab 'name': 'iCab', 'browser': /iCab/.test(ve) }, { // Konqueror 'name': 'Konqueror', 'browser': /KDE/.test(ve) }, { // AOL Explorer 'identifier': 'aol', 'name': 'AOL Explorer', 'browser': /America Online Browser/.test(ua), 'version': ua.match(/rev(\d+(?:\.\d+)+)/) }, { // Flock 'name': 'Flock', 'browser': /Flock/.test(ua) }, { // Camino 'name': 'Camino', 'browser': /Camino/.test(ve) }, { // Firefox 'name': 'Firefox', 'browser': /Firefox/.test(ua) }, { // Netscape 'name': 'Netscape', 'browser': /Netscape/.test(ua) }, { // Internet Explorer // 'identifier': 'msie', 'name': 'Internet Explorer', 'browser': /MSIE/.test(ua), 'version': ua.match( /MSIE (\d+(?:\.\d+)+(?:b\d*)?)/ ) }, { // Mozilla 'name': 'Mozilla', 'browser': /Gecko|Mozilla/.test(ua), 'version': ua.match(/rv:(\d+(?:\.\d+)+)/) } ]; i < data.length; i++ ) { if( data[i].browser ) { // we have a match // If the identifier is not explicitly set, use a lowercase // version of the given name. var identifier = data[i].identifier ? data[i].identifier : data[i].name.toLowerCase(); // Make a note that this browser was detected. Private[ identifier ] = true; // $.browser.browser() will now return the correct browser. Private.browser = data[i].name; var result; if( data[i].version != undefined && (result = data[i].version) ) { // Use the explicitly set test for browser version. Private.version.string = result[1]; Private.version.number = parseFloat( result[1] ); } else { // Otherwise use the default test which searches for the // version number after the browser name in the user agent // string. var re = new RegExp( data[i].name + '(?:\\s|\\/)(\\d+(?:\\.\\d+)+(?:(?:a|b)\\d*)?)' ); result = ua.match(re); if( result != undefined ) { Private.version.string = result[1]; Private.version.number = parseFloat( result[1] ); } } //If we're on a Gecko based browser, mark Private.mozilla as true if (/firefox|camino|flock|netscape/i.test(Private.browser)) { Private.mozilla = true; } // Once we've detected the browser there is no need to check the // others. break; } }; /** * Loop over the items in 'data' trying to find a operating system match * with the test in data[i].os(). * * 'name': A string containing the full name of the operating * system. * 'identifier': By default this is a lowercase version of 'name', but * this can be overwritten by explicitly defining an * 'identifier'. * 'OS': A function that returns a boolean value indicating * whether or not the given operating system is detected. */ for( var i = 0, // counter pl = navigator.platform, // the navigator's platform string data = [ // OS data and tests { // Microsoft Windows 'identifier': 'win', 'name': 'Windows', 'OS': /Win/.test(pl) }, { // Apple Mac OS 'name': 'Mac', 'OS': /Mac/.test(pl) }, { // Linux 'name': 'Linux', 'OS': /Linux/.test(pl) } ]; i < data.length; i++ ) { if( data[i].OS ) { // we have a match // If the identifier is not explicitly set, use a lowercase // version of the given name. var identifier = data[i].identifier ? data[i].identifier : data[i].name.toLowerCase(); // Make a note that the OS was detected. Private[ identifier ] = true; // $.browser.OS() will now return the correct OS. Private.OS = data[i].name; // Once we've detected the browser there is no need to check the // others. break; } }; /** * The following functions and attributes form the Public interface of the * jQBrowser² plugin, accessed externally through the $.browser object. * See the relevant function definition later in the source for further * information. * * $.browser.browser * $.browser.version.number() * $.browser.version.string() * * * version.string() and version.number both take arguments ( best to use 'round'), to round out the version number * $.browser.OS * * $.browser.aol * $.browser.camino * $.browser.firefox * $.browser.flock * $.browser.icab * $.browser.konqueror * $.browser.mozilla * $.browser.msie * $.browser.netscape * $.browser.opera * $.browser.safari * * $.browser.linux * $.browser.mac * $.browser.win */ var Public = { // The current browser, its version as a number or a string, and the // operating system its running on. 'browser': Private.browser, 'version': { 'number': function() { return !arguments.length ? Private.version.number : Math.floor(Private.version.number); }, 'string': function() { return !arguments.length ? Private.version.string : this.number('round').toString(); } }, 'OS': Private.OS, // A boolean value indicating whether or not the given browser was // detected. 'aol': Private.aol, 'camino': Private.camino, 'firefox': Private.firefox, 'flock': Private.flock, 'icab': Private.icab, 'konqueror': Private.konqueror, 'mozilla': Private.mozilla, 'msie': Private.msie, 'netscape': Private.netscape, 'opera': Private.opera, 'safari': Private.safari, // A boolean value indicating whether or not the given OS was // detected. 'linux': Private.linux, 'mac': Private.mac, 'win': Private.win }; jQuery.browser = Public; // Browser selectors if(!add_selectors){return;} var bn = jQuery.browser.browser.toLowerCase(); var bv = jQuery.browser.version.string('round'); var b = jQuery.browser.msie // IE ? 'ie ie'+jQuery.browser.version.string('round') : (jQuery.browser.mozilla) // Gecko ? 'gecko '+ bn + bv + ' ' + bn : (jQuery.browser.opera) // Opera ? 'opera ' + bn + bv : (jQuery.browser.safari) // Safari ? 'safari ' + bn + bv : jQuery.browser.konqueror // Konqueror ? 'konqueror ' + bn + bv : jQuery.browser.icab // iCab ? 'icab ' + bn + bv : jQuery.browser.aol // AOL ? 'aol ' + bn + bv : '', os=jQuery.browser.linux?'linux':jQuery.browser.mac?'mac':jQuery.browser.win?'win':''; jQuery('html').addClass(b).addClass(os).addClass('js'); }();