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