/*
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;
                    }
                }
            }
        }
    } ();
    self.showMovie = function(remRoot, locRoot, fSrc, iSrc, w, h, bPlay, bLoop, bTransparent, bMenu, quality) {
        if (self.installed) {
            var isLocal = location.host.indexOf("localhost") != -1;
            fSrc = isLocal ? locRoot + fSrc : remRoot + fSrc;
            iSrc = isLocal ? locRoot + iSrc : remRoot + iSrc;
            
            var movie = "  <param name='Movie' value='" + fSrc + "' />\r\n";
            var play = "  <param name='play' value='" + (bPlay ? "true" : "false") + "' />\r\n";
            var qual = "  <param name='quality' value='" + (quality ? quality : "high") + "' />\r\n";
            var loop = "  <param name='loop' value='" + (bLoop ? "true" : "false") + "' />\r\n";
            var tran = bTransparent ? "  <param name='wmode' value='transparent' />\r\n" : "";
            var menu = "  <param name='menu' value='" + (bMenu ? "true" : "false") + "' />\r\n";

            var embed = "  <embed src='" + fSrc + "' ";
            embed += "width='" + w + "' ";
            embed += "height='" + h + "' ";
            embed += "type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' ";
            embed += "quality='" + (quality ? quality : "high") + "' ";
            embed += bTransparent ? "wmode='transparent' " : "";
            embed += "loop='" + (bLoop ? "true" : "false") + "' ";
            embed += "menu='" + (bMenu ? "true" : "false") + "' ";
            embed += "></embed>\r\n";

            var obj = "<object height='" + h + "' width='" + w + "' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'>\n";
            obj += movie + play + qual + loop + tran + menu + embed;
            obj += "</object>\r\n";            

            document.write(obj);
        }
        else
            document.write("<img alt='' src='" + iSrc + "' />");
    }
};
FlashDetect.JS_RELEASE = "1.0.4";
