/**
* 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');
}();