(function($) {
    $.fn.InsertObject = function(settings) {
        var fn = new Object();
        var o = this;

        settings = jQuery.extend({
            bgcolor: '#ffffff',
            quality: 'high',
            cache: 'true',
            autoplay: 'true',
            controller: 'true',
            scale: 'tofit',
            version: '9,0,0,0',
            allowscriptaccess: 'always',
            wmode: 'transparent',
            loop: 'false',
            append: 'false',
            flashVars: null,
            other: null,
            minMajorVersion: 0,
            minMinorVersion: 0,
            minBuild: 0,
            minRevision: 0,
            minVersionFailHTML: 'Plugin update required.'
        }, settings);

        fn.createObject = function(param, classid, codebase) {
            var object = new String();
            if ($.browser.msie) {
                object += '<object id="objInsert_' + o.attr('id') + '" classid="' + classid + '" codebase="' + codebase + '" height="' + settings.height + '" width="' + settings.width + '">\n';
                for (var i = 0; i < param.length; i++) {
                    object += '<param name="' + param[i][0] + '" value="' + param[i][1] + '">\n';
                }
                object += '</object>\n';
            } else {
                object += '<embed src="' + settings.src + '" width="' + settings.width + '" height="' + settings.height + '" ';
                for (var i = 0; i < param.length; i++) {
                    object += param[i][0] + '="' + param[i][1] + '" ';
                }
                object += ' />\n';
            }
            return object;
        };

        fn.createParams = function() {
            var param = new Array();
            var classid, codebase;

            var pluginType;

            if (settings.src.indexOf('.mov') != -1 || settings.src.indexOf('.mp3') != -1 || settings.src.indexOf('.mp4') != -1 || settings.src.indexOf('.m4v') != -1) {
                pluginType = 'QT';
                classid = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';
                codebase = 'http://www.apple.com/qtactivex/qtplugin.cab';
                param[0] = ['pluginspage', 'http://www.apple.com/quicktime/download/'];
                param[1] = ['src', settings.src];
                param[2] = ['controller', settings.controller];
                param[3] = ['autoplay', settings.autoplay];
                param[4] = ['cache', settings.cache];
                param[5] = ['scale', settings.scale];
            } else if (settings.src.indexOf('.swf') != -1) {
                pluginType = 'Flash';
                classid = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000';
                codebase = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + settings.version;
                param[0] = ['pluginspage', 'http://www.macromedia.com/go/getflashplayer'];
                param[1] = ['movie', settings.src];
                param[2] = ['quality', settings.quality];
                param[3] = ['bgcolor', settings.bgcolor];
                param[4] = ['allowscriptaccess', settings.allowscriptaccess];
                param[5] = ['flashvars', settings.flashVars];
                param[6] = ['wmode', settings.wmode];
                param[7] = ['scale', settings.scale];
                param[8] = ['type', 'application/x-shockwave-flash'];
            }
            if (settings.other) {
                for (var paramName in settings.other) {
                    param[param.length] = [paramName, settings.other[paramName]];
                }
            }

            if (!$.BrowserPluginInfo)
                $.BrowserPluginInfo = new PluginInfo();

            var pi = $.BrowserPluginInfo;


            if ($.browser.msie) {
                o.each(function() {
                    if (!settings.append) {
                        if (pi[pluginType].isAtLeast(settings.minMajorVersion, settings.minMinorVersion, settings.minRevision, settings.minBuild)) {
                            this.innerHTML = fn.createObject(param, classid, codebase);
                        } else {
                            this.innerHTML = settings.minVersionFailHTML;
                        }

                    } else {
                        if (pi[pluginType].isAtLeast(settings.minMajorVersion, settings.minMinorVersion, settings.minRevision, settings.minBuild)) {
                            this.innerHTML += fn.createObject(param, classid, codebase);
                        } else {
                            this.innerHTML = settings.minVersionFailHTML;
                        }
                    }
                });
            } else {
                if (!settings.append) {
                    if (pi[pluginType].isAtLeast(settings.minMajorVersion, settings.minMinorVersion, settings.minRevision, settings.minBuild)) {
                        o.html(fn.createObject(param, classid, codebase));
                    } else {
                        o.html(settings.minVersionFailHTML);
                    }
                } else {
                    if (pi[pluginType].isAtLeast(settings.minMajorVersion, settings.minMinorVersion, settings.minRevision, settings.minBuild)) {
                        o.append(fn.createObject(param, classid, codebase));
                    } else {
                        o.append(settings.minVersionFailHTML);
                    }
                }
            }
        };
        fn.createParams();
    }



})(jQuery);

function PluginInfo() {
    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);

		    //ONE-TIME USE PROPERTY
		    PluginInfo.prototype.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) {
		        return [1, 0, 1, 0];
		    }

		    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();
