/*
	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";