﻿/*
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;
					}
				}
			}
		}
	} ();
};
FlashDetect.JS_RELEASE = "1.0.4";
