/*

Copyright (c) Copyright (c) 2007, Carl S. Yestrau All rights reserved.

Code licensed under the BSD License: http://www.featureblend.com/license.txt

Version: 1.0.4

*/

var FlashDetect = new function(){

    var self = this;

    self.installed = false;

    self.raw = "";

    self.major = -1;

    self.minor = -1;

    self.revision = -1;

    self.revisionStr = "";

    var activeXDetectRules = [

        {

            "name":"ShockwaveFlash.ShockwaveFlash.7",

            "version":function(obj){

                return getActiveXVersion(obj);

            }

        },

        {

            "name":"ShockwaveFlash.ShockwaveFlash.6",

            "version":function(obj){

                var version = "6,0,21";

                try{

                    obj.AllowScriptAccess = "always";

                    version = getActiveXVersion(obj);

                }catch(err){}

                return version;

            }

        },

        {

            "name":"ShockwaveFlash.ShockwaveFlash",

            "version":function(obj){

                return getActiveXVersion(obj);

            }

        }

    ];

    /**

     * Extract the ActiveX version of the plugin.

     * 

     * @param {Object} The flash ActiveX object.

     * @type String

     */

    var getActiveXVersion = function(activeXObj){

        var version = -1;

        try{

            version = activeXObj.GetVariable("$version");

        }catch(err){}

        return version;

    };

    /**

     * Try and retrieve an ActiveX object having a specified name.

     * 

     * @param {String} name The ActiveX object name lookup.

     * @return One of ActiveX object or a simple object having an attribute of activeXError with a value of true.

     * @type Object

     */

    var getActiveXObject = function(name){

        var obj = -1;

        try{

            obj = new ActiveXObject(name);

        }catch(err){

            obj = {activeXError:true};

        }

        return obj;

    };

    /**

     * Parse an ActiveX $version string into an object.

     * 

     * @param {String} str The ActiveX Object GetVariable($version) return value. 

     * @return An object having raw, major, minor, revision and revisionStr attributes.

     * @type Object

     */

    var parseActiveXVersion = function(str){

        var versionArray = str.split(",");//replace with regex

        return {

            "raw":str,

            "major":parseInt(versionArray[0].split(" ")[1], 10),

            "minor":parseInt(versionArray[1], 10),

            "revision":parseInt(versionArray[2], 10),

            "revisionStr":versionArray[2]

        };

    };

    /**

     * Parse a standard enabledPlugin.description into an object.

     * 

     * @param {String} str The enabledPlugin.description value.

     * @return An object having raw, major, minor, revision and revisionStr attributes.

     * @type Object

     */

    var parseStandardVersion = function(str){

        var descParts = str.split(/ +/);

        var majorMinor = descParts[2].split(/\./);

        var revisionStr = descParts[3];

        return {

            "raw":str,

            "major":parseInt(majorMinor[0], 10),

            "minor":parseInt(majorMinor[1], 10), 

            "revisionStr":revisionStr,

            "revision":parseRevisionStrToInt(revisionStr)

        };

    };

    /**

     * Parse the plugin revision string into an integer.

     * 

     * @param {String} The revision in string format.

     * @type Number

     */

    var parseRevisionStrToInt = function(str){

        return parseInt(str.replace(/[a-zA-Z]/g, ""), 10) || self.revision;

    };

    /**

     * Is the major version greater than or equal to a specified version.

     * 

     * @param {Number} version The minimum required major version.

     * @type Boolean

     */

    self.majorAtLeast = function(version){

        return self.major >= version;

    };

    /**

     * Is the minor version greater than or equal to a specified version.

     * 

     * @param {Number} version The minimum required minor version.

     * @type Boolean

     */

    self.minorAtLeast = function(version){

        return self.minor >= version;

    };

    /**

     * Is the revision version greater than or equal to a specified version.

     * 

     * @param {Number} version The minimum required revision version.

     * @type Boolean

     */

    self.revisionAtLeast = function(version){

        return self.revision >= version;

    };

    /**

     * Is the version greater than or equal to a specified major, minor and revision.

     * 

     * @param {Number} major The minimum required major version.

     * @param {Number} (Optional) minor The minimum required minor version.

     * @param {Number} (Optional) revision The minimum required revision version.

     * @type Boolean

     */

    self.versionAtLeast = function(major){

        var properties = [self.major, self.minor, self.revision];

        var len = Math.min(properties.length, arguments.length);

        for(i=0; i<len; i++){

            if(properties[i]>=arguments[i]){

                if(i+1<len && properties[i]==arguments[i]){

                    continue;

                }else{

                    return true;

                }

            }else{

                return false;

            }

        }

    };

    /**

     * Constructor, sets raw, major, minor, revisionStr, revision and installed public properties.

     */

    self.FlashDetect = function(){

        if(navigator.plugins && navigator.plugins.length>0){

            var type = 'application/x-shockwave-flash';

            var mimeTypes = navigator.mimeTypes;

            if(mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin && mimeTypes[type].enabledPlugin.description){

                var version = mimeTypes[type].enabledPlugin.description;

                var versionObj = parseStandardVersion(version);

                self.raw = versionObj.raw;

                self.major = versionObj.major;

                self.minor = versionObj.minor; 

                self.revisionStr = versionObj.revisionStr;

                self.revision = versionObj.revision;

                self.installed = true;

            }

        }else if(navigator.appVersion.indexOf("Mac")==-1 && window.execScript){

            var version = -1;

            for(var i=0; i<activeXDetectRules.length && version==-1; i++){

                var obj = getActiveXObject(activeXDetectRules[i].name);

                if(!obj.activeXError){

                    self.installed = true;

                    version = activeXDetectRules[i].version(obj);

                    if(version!=-1){

                        var versionObj = parseActiveXVersion(version);

                        self.raw = versionObj.raw;

                        self.major = versionObj.major;

                        self.minor = versionObj.minor; 

                        self.revision = versionObj.revision;

                        self.revisionStr = versionObj.revisionStr;

                    }

                }

            }

        }

    }();

};

