// jQuery SWFObject v1.1.1 MIT/GPL @jon_neal
// http://jquery.thewikies.com/swfobject

(function($, flash, Plugin) {
        var OBJECT = 'object',
                ENCODE = true;

        function _compareArrayIntegers(a, b) {
                var x = (a[0] || 0) - (b[0] || 0);

                return x > 0 || (
                        !x &&
                        a.length > 0 &&
                        _compareArrayIntegers(a.slice(1), b.slice(1))
                );
        }

        function _objectToArguments(obj) {
                if (typeof obj != OBJECT) {
                        return obj;
                }

                var arr = [],
                        str = '';

                for (var i in obj) {
                        if (typeof obj[i] == OBJECT) {
                                str = _objectToArguments(obj[i]);
                        }
                        else {
                                str = [i, (ENCODE) ? encodeURI(obj[i]) : obj[i]].join('=');
                        }

                        arr.push(str);
                }

                return arr.join('&');
        }

        function _objectFromObject(obj) {
                var arr = [];

                for (var i in obj) {
                        if (obj[i]) {
                                arr.push([i, '="', obj[i], '"'].join(''));
                        }
                }

                return arr.join(' ');
        }

        function _paramsFromObject(obj) {
                var arr = [];

                for (var i in obj) {
                        arr.push([
                                '<param name="', i,
                                '" value="', _objectToArguments(obj[i]), '" />'
                        ].join(''));
                }

                return arr.join('');
        }

        try {
                var flashVersion = Plugin.description || (function () {
                        return (
                                new Plugin('ShockwaveFlash.ShockwaveFlash')
                        ).GetVariable('$version');
                }())
        }
        catch (e) {
                flashVersion = 'Unavailable';
        }

        var flashVersionMatchVersionNumbers = flashVersion.match(/\d+/g) || [0];

        $[flash] = {
                available: flashVersionMatchVersionNumbers[0] > 0,

                activeX: Plugin && !Plugin.name,

                version: {
                        original: flashVersion,
                        array: flashVersionMatchVersionNumbers,
                        string: flashVersionMatchVersionNumbers.join('.'),
                        major: parseInt(flashVersionMatchVersionNumbers[0], 10) || 0,
                        minor: parseInt(flashVersionMatchVersionNumbers[1], 10) || 0,
                        release: parseInt(flashVersionMatchVersionNumbers[2], 10) || 0
                },

                hasVersion: function (version) {
                        var versionArray = (/string|number/.test(typeof version))
                                ? version.toString().split('.')
                                : (/object/.test(typeof version))
                                        ? [version.major, version.minor]
                                        : version || [0, 0];

                        return _compareArrayIntegers(
                                flashVersionMatchVersionNumbers,
                                versionArray
                        );
                },

                encodeParams: true,

                expressInstall: 'expressInstall.swf',
                expressInstallIsActive: false,

                create: function (obj) {
                        var instance = this;

                        if (
                                !obj.swf ||
                                instance.expressInstallIsActive ||
                                (!instance.available && !obj.hasVersionFail)
                        ) {
                                return false;
                        }

                        if (!instance.hasVersion(obj.hasVersion || 1)) {
                                instance.expressInstallIsActive = true;

                                if (typeof obj.hasVersionFail == 'function') {
                                        if (!obj.hasVersionFail.apply(obj)) {
                                                return false;
                                        }
                                }

                                obj = {
                                        swf: obj.expressInstall || instance.expressInstall,
                                        height: 137,
                                        width: 214,
                                        flashvars: {
                                                MMredirectURL: location.href,
                                                MMplayerType: (instance.activeX)
                                                        ? 'ActiveX' : 'PlugIn',
                                                MMdoctitle: document.title.slice(0, 47) +
                                                        ' - Flash Player Installation'
                                        }
                                };
                        }

                        attrs = {
                                data: obj.swf,
                                type: 'application/x-shockwave-flash',
                                id: obj.id || 'flash_' + Math.floor(Math.random() * 999999999),
                                width: obj.width || 320,
                                height: obj.height || 180,
                                style: obj.style || ''
                        };

                        ENCODE = typeof obj.useEncode !== 'undefined' ? obj.useEncode : instance.encodeParams;

                        obj.movie = obj.swf;
                        obj.wmode = obj.wmode || 'opaque';

                        delete obj.fallback;
                        delete obj.hasVersion;
                        delete obj.hasVersionFail;
                        delete obj.height;
                        delete obj.id;
                        delete obj.swf;
                        delete obj.useEncode;
                        delete obj.width;

                        var flashContainer = document.createElement('div');

                        flashContainer.innerHTML = [
                                '<object ', _objectFromObject(attrs), '>',
                                _paramsFromObject(obj),
                                '</object>'
                        ].join('');

                        return flashContainer.firstChild;
                }
        };

        $.fn[flash] = function (options) {
                var $this = this.find(OBJECT).andSelf().filter(OBJECT);

                if (/string|object/.test(typeof options)) {
                        this.each(
                                function () {
                                        var $this = $(this),
                                                flashObject;

                                        options = (typeof options == OBJECT) ? options : {
                                                swf: options
                                        };

                                        options.fallback = this;

                                        flashObject = $[flash].create(options);

                                        if (flashObject) {
                                                $this.children().remove();

                                                $this.html(flashObject);
                                        }
                                }
                        );
                }

                if (typeof options == 'function') {
                        $this.each(
                                function () {
                                        var instance = this,
                                        jsInteractionTimeoutMs = 'jsInteractionTimeoutMs';

                                        instance[jsInteractionTimeoutMs] =
                                                instance[jsInteractionTimeoutMs] || 0;

                                        if (instance[jsInteractionTimeoutMs] < 660) {
                                                if (instance.clientWidth || instance.clientHeight) {
                                                        options.call(instance);
                                                }
                                                else {
                                                        setTimeout(
                                                                function () {
                                                                        $(instance)[flash](options);
                                                                },
                                                                instance[jsInteractionTimeoutMs] + 66
                                                        );
                                                }
                                        }
                                }
                        );
                }

                return $this;
        };
}(
        jQuery,
        'flash',
        navigator.plugins['Shockwave Flash'] || window.ActiveXObject
));
