// This file will disappear soon, so don't hotlink.
var detectJava = {

    debug: false,
    detectedVersion: "Unknown",
    detectionSource: "None",
    // Deployment Toolkit mime types (old and new)
    mimeTypes: [
    'application/npruntime-scriptable-plugin;DeploymentToolkit',
    'application/java-deployment-toolkit'
    ],

    getCompleteVersion: function() {
        return detectJava.detectedVersion;
    },

    getVersion: function() {
        var v = detectJava.detectedVersion.split(/\.|_/);
        if (v.length >= 2) {
            return v[0] + "." + v[1];
        }
        else {
            return detectJava.detectedVersion;
        }
    },

    getSource: function() {
        return detectJava.detectionSource;
    },

    isPlugin2: function() {
        var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') != -1;
        if (isChrome) {
            // Special case: Chrome requires plugin2, but can't detect it
            return true;
        }
        var deploymentToolkit = detectJava.getPlugin();
        if (deploymentToolkit != null) {
            try {
                return deploymentToolkit.isPlugin2();
            }
            catch (err) { }
        }
        return false;
    },

    isMinimumVersion: function(minVersion) {
        return detectJava.compareVersions(detectJava.detectedVersion, minVersion) >= 0;
    },

    init: function() {
        var version;
        detectJava.initDeploymentToolkit();
        var plugin = detectJava.getPlugin();
		// For plugin2
        if (plugin && plugin.jvms) {
            version = detectJava.getHighestInstalledViaPlugin();
            if (version != "0.0") {
                detectJava.detectedVersion = version;
                detectJava.detectionSource = "JavaPlugin";
                return;
            }
        }
		// For most browsers
        if (navigator.mimeTypes && navigator.mimeTypes.length) {
            version = detectJava.getHighestInstalledViaMimeTypes();
            if (version != "0.0") {
                detectJava.detectedVersion = version;
                detectJava.detectionSource = "MimeType";
                return;
            }
        }
		// For Safari+Mac?
        if (navigator.plugins && navigator.plugins.length) {
            version = detectJava.getHighestInstalledViaPluginsArray();
            if (version != "0.0") {
                detectJava.detectedVersion = version;
                detectJava.detectionSource = "PluginsArray";
                return;
            }
        }
		// For IE
        if (window.ActiveXObject !== undefined) {
            version = detectJava.getHighestInstalledViaActiveX();
            if (version != "0.0") {
                detectJava.detectedVersion = version;
                detectJava.detectionSource = "ActiveX";
                return;
            }
        }
		// For Opera
        version = detectJava.getHighestInstalledViaJavaSystem();
        if (version != "0.0") {
            detectJava.detectedVersion = version;
            detectJava.detectionSource = "Java System Property";
            return;
        }
		// For Safari+Win. This is slowest, since it starts an applet
        version = detectJava.getHighestInstalledViaLiveConnect();
        if (version != "0.0") {
            detectJava.detectedVersion = version;
            detectJava.detectionSource = "LiveConnect";
            return;
        }
		// For MSVM. Last effort, since this can only detect 1.1
        if (detectJava.hasMSVM()) {
            detectJava.detectedVersion = "1.1";
            detectJava.detectionSource = "MSVM";
            return;
        }
    },

    getPlugin: function() {
        return document.getElementById('deploymentToolkit');
    },

    initDeploymentToolkit: function() {
        if (detectJava.getPlugin()) {
            return;
        }
        if (window.ActiveXObject !== undefined) {
            document.write('<' +
                'object classid="clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA" ' +
                'id="deploymentToolkit" width="0" height="0">' +
                '<' + '/' + 'object' + '>');
        }
        else if (navigator.mimeTypes && navigator.mimeTypes.length) {
            var written = false;
            for (var m = 0; !written && m < detectJava.mimeTypes.length; m++) {
                var mimeType = detectJava.mimeTypes[m];
                for (var i = 0; i < navigator.mimeTypes.length; i++) {
                    if (navigator.mimeTypes[i].type == mimeType) {
                        if (navigator.mimeTypes[i].enabledPlugin) {
                            document.write('<' +
                                'embed id="deploymentToolkit" type="' +
                                mimeType + '" hidden="true" />');
                            written = true;
                        }
                    }
                }
            }
        }
    },

    getHighestInstalledViaPlugin: function() {
        var version = "0.0";
        var plugin =  detectJava.getPlugin();
        for (var i = 0; i < plugin.jvms.getLength(); i++) {
            var testVersion = plugin.jvms.get(i).version;
            if (detectJava.debug) {
                document.write("Checking JavaPlugin: " + s + "<br/>");
            }
            if (detectJava.compareVersions(testVersion, version) == 1) {
                version = testVersion;
            }
        }
        return version;
    },

    getHighestInstalledViaMimeTypes: function() {
        var version = "0.0";
        var mimeTypes = [
        "application/x-java-applet;jpi-version=",
        "application/x-java-applet;version="
        ];
        for (var j = 0; j < mimeTypes.length; j++) {
            var mimeType = mimeTypes[j];
            for (var i = 0; i < navigator.mimeTypes.length; i++) {
                var s = navigator.mimeTypes[i].type;
                if (detectJava.debug) {
                    document.write("Checking mimeType: " + s + "<br/>");
                }
                if (s.substr(0, mimeType.length) == mimeType) {
                    var testVersion = s.substr(mimeType.length);
                    if (detectJava.compareVersions(testVersion, version) == 1) {
                        version = testVersion;
                    }
                }
            }
        }
        return version;
    },

    getHighestInstalledViaPluginsArray: function() {
        var version = "0.0";
        for (var i = 0; i < navigator.plugins.length; i++) {
            var s = navigator.plugins[i].description;
            if (detectJava.debug) {
                document.write("Checking PluginsArray: " + s + "<br/>");
            }
            var m = s.match(/^Java (1\.4\.2|1\.5|1\.6|1\.7|1\.8).* Plug-in/);
            if (m != null) {
                var testVersion = m[1];
                if (detectJava.compareVersions(testVersion, version) == 1) {
                    version = testVersion;
                }
            }
        }
        return version;
    },

    getHighestInstalledViaActiveX: function() {
        var versionsToTest = [
        "1.4.0", "1.4.1", "1.4.2", "1.5.0", "1.6.0", "1.7.0", "1.8.0"
        ]
        var version = "0.0";
        for (var i = 0; i < versionsToTest.length; i++) {
            var testVersion = versionsToTest[i];
            var objectName = 'JavaWebStart.isInstalled.' + testVersion + '.0';

            try {
                if (detectJava.debug) {
                    document.write("Checking ActiveX: " + objectName + "<br/>");
                }

                if (new ActiveXObject(objectName) != null) {
                    if (detectJava.compareVersions(testVersion, version) == 1) {
                        version = testVersion;
                    }
                }
            }
            catch (err) {
            // Ignore
            }
        }
        return version;
    },

    hasMSVM: function() {
        var clsid = '{08B0E5C0-4FCB-11CF-AAA5-00401C608500}';

        document.write('<IE:clientCaps ID="oClientCaps" STYLE="behavior:url(#default#clientCaps)"/>');

        if (typeof oClientCaps != 'undefined') {
            if (detectJava.debug) {
                document.write("Checking MSVM<br/>");
            }
            try {
                var v = oClientCaps.getComponentVersion(clsid, "ComponentID");
                if (v == '' || v == '5,0,5000,0') {
                    return false;
                }
                else {
                    return true;
                }
            }
            catch (e) { }
        }
        return false;
    },

    getHighestInstalledViaJavaSystem: function() {
        var version = "0.0";
        try {
            if (detectJava.debug) {
                document.write("Checking Java System Property<br/>");
            }
            // Get from Java, convert to JavaScript string
            version = java.lang.System.getProperty("java.version") + "";
        }
        catch (err) { }
        return version;
    },

    getHighestInstalledViaLiveConnect: function() {
        if (detectJava.debug) {
            document.write("Checking LiveConnect<br/>");
        }
        // Call version-specific methods until something breaks.
        // Only known method that works on Safari/Windows
        var version = "0.0";
        document.write('<applet id="javaDetectApplet" code="java.applet.Applet" ' +
            'width="0" height="0" name="Java" ' +
            'style="visibilty: hidden; display: none" ' +
            'mayscript="true"></applet>');
        var a = document.getElementById('javaDetectApplet');
        if (a != null) {
            try {
                a.isEnabled();
                version = "1.1";
            }
            catch (e11) {
                return version;
            }
            try {
                a.getAccessibleContext();
                version = "1.3";
            }
            catch (e13) {
                return version;
            }
            try {
                a.isBackgroundSet();
                version = "1.4";
            }
            catch (e14) {
                return version;
            }
            try {
                a.isPreferredSizeSet();
                version = "1.5";
            }
            catch (e15) {
                return version;
            }
            try {
                a.getBaselineResizeBehavior();
                version = "1.6";
            }
            catch (e16) {
                return version;
            }
        }
        return version;
    },

    /**
        Compares two versions in the form "x.x.x_x".

        Returns 1 if versionA is greater than versionB, -1 if versionA is less than versionB,
        and 0 if versionA is equal to versionB
    */
    compareVersions: function(versionA, versionB) {
        // Make sure both versions are strings
        versionA += '';
        versionB += '';

        var a = versionA.split(/\.|_/);
        var b = versionB.split(/\.|_/);
        var len = Math.max(a.length, b.length);
        for (var i = 0; i < len; i++) {
            if (i >= a.length) {
                a[i] = 0;
            }
            if (i >= b.length) {
                b[i] = 0;
            }
            var ai = parseInt(a[i]);
            var bi = parseInt(b[i]);
            if (ai > bi) {
                return 1;
            }
            if (ai < bi) {
                return -1;
            }
        }

        return 0;
    }
}

detectJava.init();
//
//if (typeof pageTracker != "undefined") {
//    var version = detectJava.getVersion();
//    if (version == "1.6" && detectJava.isPlugin2()) {
//        version = "1.6uN";
//    }
//    pageTracker._trackEvent("java", "version", version);
//	pageTracker._trackEvent("java", "complete_version", detectJava.getCompleteVersion());
//}
