/**
 * This code was taken from quirksmode.org and rewritten for readability,
 * efficiency, and compatability with the CharityFinders JavaScript APIs.
 * Unfortunately, it's not reliable due to browser vendor stupidity.  Only use
 * this code if object detection won't solve your problems, and the only
 * solution that might help is to _guess_ the browser name, browser version,
 * and/or operating system.
 */

////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////

var __CFBROWSER_INDEX_IDENTITY = 0;
var __CFBROWSER_INDEX_PROPERTY = 1;
var __CFBROWSER_INDEX_STRING = 2;
var __CFBROWSER_INDEX_SUBSTRING = 3;
var __CFBROWSER_INDEX_VERSION_SEARCH = 4;

var CFBROWSER_CAMINO = "Camino";
var CFBROWSER_EXPLORER = "Explorer";
var CFBROWSER_FIREFOX = "Firefox";
var CFBROWSER_ICAB = "iCab";
var CFBROWSER_KONQUEROR = "Konqueror";
var CFBROWSER_MOZILLA = "Mozilla";
var CFBROWSER_NETSCAPE = "Netscape";
var CFBROWSER_OMNIWEB = "OmniWeb";
var CFBROWSER_OPERA = "Opera";
var CFBROWSER_SAFARI = "Safari";
var CFBROWSER_SEAMONKEY = "SeaMonkey";

var CFBROWSER_OS_FREEBSD = "FreeBSD";
var CFBROWSER_OS_IPHONE = "iPhone";
var CFBROWSER_OS_IPOD = "iPod";
var CFBROWSER_OS_LINUX = "Linux";
var CFBROWSER_OS_MAC = "Mac";
var CFBROWSER_OS_NINTENDO = "Nintendo";
var CFBROWSER_OS_SUN = "SunOS";
var CFBROWSER_OS_SYMBIAN = "Symbian";
var CFBROWSER_OS_SYNERGY = "SYNERGY";
var CFBROWSER_OS_WINDOWS = "Windows";

var CFBROWSER_UNKNOWN = undefined;

var __CFBROWSER_OS_SEARCH_DATA = [
    [CFBROWSER_OS_WINDOWS, undefined, navigator.platform, "Win"],
    [CFBROWSER_OS_WINDOWS, undefined, navigator.platform, "CE.Net"],
    [CFBROWSER_OS_FREEBSD, undefined, navigator.platform, "FreeBSD"],
    [CFBROWSER_OS_MAC, undefined, navigator.platform, "Mac"],
    [CFBROWSER_OS_LINUX, undefined, navigator.platform, "Linux"],
    [CFBROWSER_OS_SUN, undefined, navigator.platform, "SunOS"],
    [CFBROWSER_OS_SYMBIAN, undefined, navigator.userAgent, "Symbian"],
    [CFBROWSER_OS_SYNERGY, undefined, navigator.platform, "SYNERGY"],
    [CFBROWSER_OS_NINTENDO, undefined, navigator.platform, "Nintendo"],
    [CFBROWSER_OS_IPHONE, undefined, navigator.platform, "iPhone"],
    [CFBROWSER_OS_IPOD, undefined, navigator.platform, "iPod"]
];

var __CFBROWSER_SEARCH_DATA = [
    [CFBROWSER_OMNIWEB, undefined, navigator.userAgent, "OmniWeb", "OmniWeb/"],
    [CFBROWSER_SAFARI, undefined, navigator.vendor, "Apple", "Safari"],
    [CFBROWSER_OPERA, window.opera, undefined, undefined, "Opera"],
    [CFBROWSER_ICAB, undefined, navigator.vendor, "iCab", "iCab"],
    [CFBROWSER_KONQUEROR, undefined, navigator.vendor, "KDE", "Konqueror"],
    [CFBROWSER_FIREFOX, undefined, navigator.userAgent, "Firefox", "Firefox"],
    [CFBROWSER_SEAMONKEY, undefined, navigator.userAgent, "SeaMonkey",
     "SeaMonkey"],
    [CFBROWSER_CAMINO, undefined, navigator.vendor, "Camino", "Camino"],
    [CFBROWSER_NETSCAPE, undefined, navigator.userAgent, "Netscape",
     "Netscape"],
    [CFBROWSER_EXPLORER, undefined, navigator.userAgent, "MSIE", "MSIE"],
    [CFBROWSER_MOZILLA, undefined, navigator.userAgent, "Gecko", "rv"],
    [CFBROWSER_NETSCAPE, undefined, navigator.userAgent, "Mozilla", "Mozilla"]
];

var __CFBROWSER_WARNING_BROWSER_INFO = "unable to detect browser name/version";
var __CFBROWSER_WARNING_OS_INFO = "unable to detect operating system";

////////////////////////////////////////////////////////////////////////////////
// Static variables
////////////////////////////////////////////////////////////////////////////////

var __cfBrowserName = undefined;
var __cfBrowserOS = undefined;
var __cfBrowserVersion = undefined;

////////////////////////////////////////////////////////////////////////////////
// Private functions
////////////////////////////////////////////////////////////////////////////////

function __cfBrowserSearchData(data)
{
    for (var i = 0; i < data.length; i++) {
        var info = data[i];
        var s = info[__CFBROWSER_INDEX_STRING];
        if ((s && (s.indexOf(info[__CFBROWSER_INDEX_SUBSTRING]) != -1)) ||
            (info[__CFBROWSER_INDEX_PROPERTY])) {
            return info;
        }
    }
    return undefined;
}

function __cfBrowserSearchVersion(data, version)
{
    var index = data.indexOf(version);
    return (index == -1) ? undefined :
           parseFloat(data.substring(index + version.length + 1));
}

////////////////////////////////////////////////////////////////////////////////
// Public API
////////////////////////////////////////////////////////////////////////////////

function cfBrowserGetName()
{
    return __cfBrowserName;
}

function cfBrowserGetOS()
{
    return __cfBrowserOS;
}

function cfBrowserGetVersion()
{
    return __cfBrowserVersion;
}

////////////////////////////////////////////////////////////////////////////////
// Initialization
////////////////////////////////////////////////////////////////////////////////

var browserInfo = __cfBrowserSearchData(__CFBROWSER_SEARCH_DATA);
if (browserInfo) {
    __cfBrowserName = browserInfo[__CFBROWSER_INDEX_IDENTITY];
    var s = browserInfo[__CFBROWSER_INDEX_VERSION_SEARCH];
    __cfBrowserVersion = __cfBrowserSearchVersion(navigator.userAgent, s) ||
                         __cfBrowserSearchVersion(navigator.appVersion, s) ||
                         CFBROWSER_UNKNOWN;
} else {
    cfWarningTrigger(__CFBROWSER_WARNING_BROWSER_INFO);
}
var osInfo = __cfBrowserSearchData(__CFBROWSER_OS_SEARCH_DATA);
if (osInfo) {
    __cfBrowserOS = osInfo[__CFBROWSER_INDEX_IDENTITY];
} else {
    cfWarningTrigger(__CFBROWSER_WARNING_OS_INFO);
}
