function PluginInfo() {
	//ONE-TIME USE PROPERTY
	PluginInfo.prototype.allPlugins = allPlugins;
	
	if (navigator.plugins.length) {
		for (var i = 0; i < navigator.plugins.length; i++) {
			for (var x = 0; x < this.allPlugins.length; x++) {
				checkPlugin(navigator.plugins[i], this.allPlugins[x].pluginName, this.allPlugins[x].pluginObj, this.allPlugins[x].versionDelegate, this.installedPlugins);
			}
		}
	} else if (window.ActiveXObject) {
		for (var x = 0; x < this.allPlugins.length; x++) {
			checkPluginAX(this.allPlugins[x].pluginNameAX, this.allPlugins[x].pluginObj, this.allPlugins[x].versionDelegateAX, this.installedPlugins);
		}
	}
	
	//REMOVE ONE-TIME USE PROPERTY
	delete PluginInfo.prototype.allPlugins;
	
	function checkPlugin(navigatorPlugin, pluginName, pluginObject, versionDelegate, installedPluginsArray) {
		if (!pluginObject.isInstalled && navigatorPlugin.name.indexOf(pluginName) >= 0) {
			setupVersionInfo(pluginObject, navigatorPlugin, versionDelegate, installedPluginsArray);
			return true;
		}
		return false;
	}
	
	function checkPluginAX(pluginName, pluginObject, versionDelegate, installedPluginsArray) {
		try {
			var axObject = new ActiveXObject(pluginName);
			
			if (!pluginObject.isInstalled && axObject) {
				setupVersionInfo(pluginObject, axObject, versionDelegate, installedPluginsArray);
				return true;
			}
		} catch(e) {}
		return false;
	}
	
	function setupVersionInfo(pluginObject, versionObject, versionDelegate, installedPluginsArray) {
		var versionArray = versionDelegate(versionObject);
		
		if (versionArray && versionArray.constructor == Array && versionArray.length == 4) {
			installedPluginsArray.push(pluginObject);
			pluginObject.isInstalled = true;
			pluginObject.majorVer = versionArray[0];
			pluginObject.minorVer = versionArray[1];
			pluginObject.revision = versionArray[2];
			pluginObject.build = versionArray[3];
		}
	}
}
(
	function() {
		var allPlugins = new Array();
		function Plugin(displayName, pluginName, pluginNameAX, versionDelegate, versionDelegateAX) {			
			this.name = displayName;
			
			pluginName = pluginName.constructor == Array ? pluginName : new Array(pluginName);
			pluginNameAX = pluginNameAX.constructor == Array ? pluginNameAX : new Array(pluginNameAX);
			versionDelegate = versionDelegate.constructor == Array ? versionDelegate : new Array(versionDelegate);
			versionDelegateAX = versionDelegateAX.constructor == Array ? versionDelegateAX : new Array(versionDelegateAX);
			
			syncArrays(pluginName, versionDelegate, pluginNameAX, versionDelegateAX);
			
			for (var i = 0; i < pluginName.length; i++) {
				allPlugins.push({
					pluginObj: this,
					pluginName: pluginName[i],
					pluginNameAX: pluginNameAX[i],
					versionDelegate: versionDelegate[i],
					versionDelegateAX: versionDelegateAX[i]
				});
			}
		}
		function syncArrays(arrays) {
			var maxLength = 0;
			for (var i = 0; i < arguments.length; i++) {
				maxLength = Math.max(maxLength, arguments[i].length);
			}
			for (var i = 0; i < arguments.length; i++) {
				while (arguments[i].length < maxLength) {
					arguments[i].push(arguments[i][0]);
				}
			}
		}
		function isAtLeast(majorVer, minorVer, revision, build) {
			if (this.isInstalled) {
				var installedVer = [this.majorVer, this.minorVer, this.revision, this.build];
				var checkVer = [majorVer, minorVer, revision, build];
				
				return isGreaterOrEqual(installedVer, checkVer, 0);
			} else {
				return false;
			}
		}
		function isGreaterOrEqual(leftArray, rightArray, startIndex) {
			if (leftArray.length != rightArray.length) {
				return false;
			} else if (leftArray[startIndex] > rightArray[startIndex]) {
				return true;
			} else if (leftArray[startIndex] < rightArray[startIndex]) {
				return false;
			} else if (startIndex == leftArray.length) {
				return true;
			} else {
				return isGreaterOrEqual(leftArray, rightArray, ++startIndex);
			}
		}
		function getFullVer() {
			return [this.majorVer, this.minorVer, this.revision, this.build].join('.');
		}
		
		Plugin.prototype.name;
		Plugin.prototype.isInstalled = false;
		Plugin.prototype.majorVer;
		Plugin.prototype.minorVer;
		Plugin.prototype.revision;
		Plugin.prototype.build;
		Plugin.prototype.isAtLeast = isAtLeast;
		Plugin.prototype.getFullVer = getFullVer;
		
		PluginInfo.prototype.QT = new Plugin('QuickTime', 'QuickTime Plug-in', ['QuickTimeCheckObject.QuickTimeCheck.1', 'QuickTime.QuickTime'], qtVersion, qtVersionAX);
		PluginInfo.prototype.Flash = new Plugin('Flash', 'Shockwave Flash', 'ShockwaveFlash.ShockwaveFlash', flashVersion, flashVersionAX);
		PluginInfo.prototype.CNIVideoUploader = new Plugin('CNI Video Uploader', 'LA Casting Video Uploader', 'nplacastingvideouploader.VideoUploader', cniVideoUploaderVersion, cniVideoUploaderVersionAX);
		
		this.allPlugins = allPlugins;
		
		//VERSION DELEGATES//
		function flashVersion(navigatorPlugin) {
			var fullVersion = navigatorPlugin.description.replace(/ {2,}/gm, ' ').split(' ');
			var subVersion = fullVersion[fullVersion.length - 2].split('.');
			return [
				parseInt(subVersion[0], 10),
				parseInt(subVersion[1], 10),
				parseInt(fullVersion[fullVersion.length - 1].substring(1), 10),
				subVersion.length >= 3 ? parseInt(subVersion[2], 10) : 0
			];
		}
	
		function flashVersionAX(axObject) {
			var fullVersion = axObject.GetVariable('$version').split(' ');
			var subVersion = fullVersion[1].split(',');
			return [
				parseInt(subVersion[0], 10),
				parseInt(subVersion[1], 10),
				parseInt(subVersion[2], 10),
				parseInt(subVersion[3], 10)
			];
		}
	
		function qtVersion(navigatorPlugin) {
			var fullVersion = navigatorPlugin.name.split(' ');
			var subVersion = fullVersion[2].split('.');
			return [
				parseInt(subVersion[0], 10),
				parseInt(subVersion[1], 10),
				subVersion.length >= 3 ? parseInt(subVersion[2], 10) : 0,
				fullVersion.length >= 4 ? parseInt(fullVersion[3].substring(1, fullVersion[3].length - 1)) : 0
			];
		}
	
		function qtVersionAX(axObject) {
			var fullVersion = axObject.QuickTimeVersion.toString(16);
			return [
				parseInt(fullVersion.substring(0, 1), 10),
				parseInt(fullVersion.substring(1, 2), 10),
				parseInt(fullVersion.substring(2, 3), 10),
				parseInt(fullVersion.substring(3, 4), 10)
			];
		}
	
		function cniVideoUploaderVersion(navigatorPlugin) {
			var rxVersion = /v\.\((\d+(\.\d+){0,3})\)$/i
			var fullVersion = navigatorPlugin.description.match(rxVersion);
			var subVersion = fullVersion ? fullVersion[1].split('.') : [1, 0, 0, 0];
			while (subVersion.length < 4) {
				subVersion.push(0);
			}
			return [
				parseInt(subVersion[0], 10),
				parseInt(subVersion[1], 10),
				parseInt(subVersion[2], 10),
				parseInt(subVersion[3], 10)
			];
		}
		
		function cniVideoUploaderVersionAX(axObject) {
			var fullVersion = axObject.version ? axObject.version.split('.') : [1, 0, 0, 0];
			while (fullVersion.length < 4) {
				fullVersion.push(0);
			}			
			return [
				parseInt(fullVersion[0], 10),
				parseInt(fullVersion[1], 10),
				parseInt(fullVersion[2], 10),
				parseInt(fullVersion[3], 10)
			];
		}
	}
)();

PluginInfo.prototype.installedPlugins = new Array();
