/*
 * jPlayer Plugin for jQuery JavaScript Library
 * http://www.happyworm.com/jquery/jplayer
 *
 * Copyright (c) 2009 - 2010 Happyworm Ltd
 * Dual licensed under the MIT and GPL licenses.
 *  - http://www.opensource.org/licenses/mit-license.php
 *  - http://www.gnu.org/copyleft/gpl.html
 *
 * Author: Mark J Panaghiston
 * Version: 2.0.0
 * Date: 20th December 2010
 */
(function (c, h) {
    c.fn.jPlayer = function (a) {
        var b = typeof a === "string",
            d = Array.prototype.slice.call(arguments, 1),
            f = this;
        a = !b && d.length ? c.extend.apply(null, [true, a].concat(d)) : a;
        if (b && a.charAt(0) === "_") return f;
        b ? this.each(function () {
            var e = c.data(this, "jPlayer"),
                g = e && c.isFunction(e[a]) ? e[a].apply(e, d) : e;
            if (g !== e && g !== h) {
                f = g;
                return false
            }
        }) : this.each(function () {
            var e = c.data(this, "jPlayer");
            if (e) {
                e.option(a || {})._init();
                e.option(a || {})
            } else c.data(this, "jPlayer", new c.jPlayer(a, this))
        });
        return f
    };
    c.jPlayer = function (a, b) {
        if (arguments.length) {
            this.element = c(b);
            this.options = c.extend(true, {}, this.options, a);
            var d = this;
            this.element.bind("remove.jPlayer", function () {
                d.destroy()
            });
            this._init()
        }
    };
    c.jPlayer.event = {
        ready: "jPlayer_ready",
        resize: "jPlayer_resize",
        error: "jPlayer_error",
        warning: "jPlayer_warning",
        loadstart: "jPlayer_loadstart",
        progress: "jPlayer_progress",
        suspend: "jPlayer_suspend",
        abort: "jPlayer_abort",
        emptied: "jPlayer_emptied",
        stalled: "jPlayer_stalled",
        play: "jPlayer_play",
        pause: "jPlayer_pause",
        loadedmetadata: "jPlayer_loadedmetadata",
        loadeddata: "jPlayer_loadeddata",
        waiting: "jPlayer_waiting",
        playing: "jPlayer_playing",
        canplay: "jPlayer_canplay",
        canplaythrough: "jPlayer_canplaythrough",
        seeking: "jPlayer_seeking",
        seeked: "jPlayer_seeked",
        timeupdate: "jPlayer_timeupdate",
        ended: "jPlayer_ended",
        ratechange: "jPlayer_ratechange",
        durationchange: "jPlayer_durationchange",
        volumechange: "jPlayer_volumechange"
    };
    c.jPlayer.htmlEvent = ["loadstart", "abort", "emptied", "stalled", "loadedmetadata", "loadeddata", "canplaythrough", "ratechange"];
    c.jPlayer.pause = function () {
        c.each(c.jPlayer.prototype.instances, function (a, b) {
            b.data("jPlayer").status.srcSet && b.jPlayer("pause")
        })
    };
    c.jPlayer.timeFormat = {
        showHour: false,
        showMin: true,
        showSec: true,
        padHour: false,
        padMin: true,
        padSec: true,
        sepHour: ":",
        sepMin: ":",
        sepSec: ""
    };
    c.jPlayer.convertTime = function (a) {
        a = new Date(a * 1E3);
        var b = a.getUTCHours(),
            d = a.getUTCMinutes();
        a = a.getUTCSeconds();
        b = c.jPlayer.timeFormat.padHour && b < 10 ? "0" + b : b;
        d = c.jPlayer.timeFormat.padMin && d < 10 ? "0" + d : d;
        a = c.jPlayer.timeFormat.padSec && a < 10 ? "0" + a : a;
        return (c.jPlayer.timeFormat.showHour ? b + c.jPlayer.timeFormat.sepHour : "") + (c.jPlayer.timeFormat.showMin ? d + c.jPlayer.timeFormat.sepMin : "") + (c.jPlayer.timeFormat.showSec ? a + c.jPlayer.timeFormat.sepSec : "")
    };
    c.jPlayer.uaMatch = function (a) {
        a = a.toLowerCase();
        var b = /(opera)(?:.*version)?[ \/]([\w.]+)/,
            d = /(msie) ([\w.]+)/,
            f = /(mozilla)(?:.*? rv:([\w.]+))?/;
        a = /(webkit)[ \/]([\w.]+)/.exec(a) || b.exec(a) || d.exec(a) || a.indexOf("compatible") < 0 && f.exec(a) || [];
        return {
            browser: a[1] || "",
            version: a[2] || "0"
        }
    };
    c.jPlayer.browser = {};
    var m = c.jPlayer.uaMatch(navigator.userAgent);
    if (m.browser) {
        c.jPlayer.browser[m.browser] = true;
        c.jPlayer.browser.version = m.version
    }
    c.jPlayer.prototype = {
        count: 0,
        version: {
            script: "2.0.0",
            needFlash: "2.0.0",
            flash: "unknown"
        },
        options: {
            swfPath: "js",
            solution: "html, flash",
            supplied: "mp3",
            preload: "metadata",
            volume: 0.8,
            muted: false,
            backgroundColor: "red",
            cssSelectorAncestor: "#jp_interface_1",
            cssSelector: {
                videoPlay: ".jp-video-play",
                play: ".jp-play",
                pause: ".jp-pause",
                stop: ".jp-stop",
                seekBar: ".jp-seek-bar",
                playBar: ".jp-play-bar",
                mute: ".jp-mute",
                unmute: ".jp-unmute",
                volumeBar: ".jp-volume-bar",
                volumeBarValue: ".jp-volume-bar-value",
                currentTime: ".jp-current-time",
                duration: ".jp-duration"
            },
            idPrefix: "jp",
            errorAlerts: false,
            warningAlerts: false
        },
        instances: {},
        status: {
            src: "",
            media: {},
            paused: true,
            format: {},
            formatType: "",
            waitForPlay: true,
            waitForLoad: true,
            srcSet: false,
            video: false,
            seekPercent: 0,
            currentPercentRelative: 0,
            currentPercentAbsolute: 0,
            currentTime: 0,
            duration: 0
        },
        _status: {
            volume: h,
            muted: false,
            width: 0,
            height: 0
        },
        internal: {
            ready: false,
            instance: h,
            htmlDlyCmdId: h
        },
        solution: {
            html: true,
            flash: true
        },
        format: {
            mp3: {
                codec: 'audio/mpeg; codecs="mp3"',
                flashCanPlay: true,
                media: "audio"
            },
            m4a: {
                codec: 'audio/mp4; codecs="mp4a.40.2"',
                flashCanPlay: true,
                media: "audio"
            },
            oga: {
                codec: 'audio/ogg; codecs="vorbis"',
                flashCanPlay: false,
                media: "audio"
            },
            wav: {
                codec: 'audio/wav; codecs="1"',
                flashCanPlay: false,
                media: "audio"
            },
            webma: {
                codec: 'audio/webm; codecs="vorbis"',
                flashCanPlay: false,
                media: "audio"
            },
            m4v: {
                codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
                flashCanPlay: true,
                media: "video"
            },
            ogv: {
                codec: 'video/ogg; codecs="theora, vorbis"',
                flashCanPlay: false,
                media: "video"
            },
            webmv: {
                codec: 'video/webm; codecs="vorbis, vp8"',
                flashCanPlay: false,
                media: "video"
            }
        },
        _init: function () {
            var a = this;
            this.element.empty();
            this.status = c.extend({}, this.status, this._status);
            this.internal = c.extend({}, this.internal);
            this.formats = [];
            this.solutions = [];
            this.require = {};
            this.htmlElement = {};
            this.html = {};
            this.html.audio = {};
            this.html.video = {};
            this.flash = {};
            this.css = {};
            this.css.cs = {};
            this.css.jq = {};
            this.status.volume = this._limitValue(this.options.volume, 0, 1);
            this.status.muted = this.options.muted;
            this.status.width = this.element.css("width");
            this.status.height = this.element.css("height");
            this.element.css({
                "background-color": this.options.backgroundColor
            });
            c.each(this.options.supplied.toLowerCase().split(","), function (e, g) {
                var i = g.replace(/^\s+|\s+$/g, "");
                if (a.format[i]) {
                    var j = false;
                    c.each(a.formats, function (n, k) {
                        if (i === k) {
                            j = true;
                            return false
                        }
                    });
                    j || a.formats.push(i)
                }
            });
            c.each(this.options.solution.toLowerCase().split(","), function (e, g) {
                var i = g.replace(/^\s+|\s+$/g, "");
                if (a.solution[i]) {
                    var j = false;
                    c.each(a.solutions, function (n, k) {
                        if (i === k) {
                            j = true;
                            return false
                        }
                    });
                    j || a.solutions.push(i)
                }
            });
            this.internal.instance = "jp_" + this.count;
            this.instances[this.internal.instance] = this.element;
            this.element.attr("id") === "" && this.element.attr("id", this.options.idPrefix + "_jplayer_" + this.count);
            this.internal.self = c.extend({}, {
                id: this.element.attr("id"),
                jq: this.element
            });
            this.internal.audio = c.extend({}, {
                id: this.options.idPrefix + "_audio_" + this.count,
                jq: h
            });
            this.internal.video = c.extend({}, {
                id: this.options.idPrefix + "_video_" + this.count,
                jq: h
            });
            this.internal.flash = c.extend({}, {
                id: this.options.idPrefix + "_flash_" + this.count,
                jq: h,
                swf: this.options.swfPath + (this.options.swfPath !== "" && this.options.swfPath.slice(-1) !== "/" ? "/" : "") + "Jplayer.swf"
            });
            this.internal.poster = c.extend({}, {
                id: this.options.idPrefix + "_poster_" + this.count,
                jq: h
            });
            c.each(c.jPlayer.event, function (e, g) {
                if (a.options[e] !== h) {
                    a.element.bind(g + ".jPlayer", a.options[e]);
                    a.options[e] = h
                }
            });
            this.htmlElement.poster = document.createElement("img");
            this.htmlElement.poster.id = this.internal.poster.id;
            this.htmlElement.poster.onload = function () {
                if (!a.status.video || a.status.waitForPlay) a.internal.poster.jq.show()
            };
            this.element.append(this.htmlElement.poster);
            this.internal.poster.jq = c("#" + this.internal.poster.id);
            this.internal.poster.jq.css({
                width: this.status.width,
                height: this.status.height
            });
            this.internal.poster.jq.hide();
            this.require.audio = false;
            this.require.video = false;
            c.each(this.formats, function (e, g) {
                a.require[a.format[g].media] = true
            });
            this.html.audio.available = false;
            if (this.require.audio) {
                this.htmlElement.audio = document.createElement("audio");
                this.htmlElement.audio.id = this.internal.audio.id;
                this.html.audio.available = !! this.htmlElement.audio.canPlayType
            }
            this.html.video.available = false;
            if (this.require.video) {
                this.htmlElement.video = document.createElement("video");
                this.htmlElement.video.id = this.internal.video.id;
                this.html.video.available = !! this.htmlElement.video.canPlayType
            }
            this.flash.available = this._checkForFlash(10);
            this.html.canPlay = {};
            this.flash.canPlay = {};
            c.each(this.formats, function (e, g) {
                a.html.canPlay[g] = a.html[a.format[g].media].available && "" !== a.htmlElement[a.format[g].media].canPlayType(a.format[g].codec);
                a.flash.canPlay[g] = a.format[g].flashCanPlay && a.flash.available
            });
            this.html.desired = false;
            this.flash.desired = false;
            c.each(this.solutions, function (e, g) {
                if (e === 0) a[g].desired = true;
                else {
                    var i = false,
                        j = false;
                    c.each(a.formats, function (n, k) {
                        if (a[a.solutions[0]].canPlay[k]) if (a.format[k].media === "video") j = true;
                        else i = true
                    });
                    a[g].desired = a.require.audio && !i || a.require.video && !j
                }
            });
            this.html.support = {};
            this.flash.support = {};
            c.each(this.formats, function (e, g) {
                a.html.support[g] = a.html.canPlay[g] && a.html.desired;
                a.flash.support[g] = a.flash.canPlay[g] && a.flash.desired
            });
            this.html.used = false;
            this.flash.used = false;
            c.each(this.solutions, function (e, g) {
                c.each(a.formats, function (i, j) {
                    if (a[g].support[j]) {
                        a[g].used = true;
                        return false
                    }
                })
            });
            this.html.used || this.flash.used || this._error({
                type: c.jPlayer.error.NO_SOLUTION,
                context: "{solution:'" + this.options.solution + "', supplied:'" + this.options.supplied + "'}",
                message: c.jPlayer.errorMsg.NO_SOLUTION,
                hint: c.jPlayer.errorHint.NO_SOLUTION
            });
            this.html.active = false;
            this.html.audio.gate = false;
            this.html.video.gate = false;
            this.flash.active = false;
            this.flash.gate = false;

            if (this.flash.used) {
                var b = "id=" + escape(this.internal.self.id) + "&vol=" + this.status.volume + "&muted=" + this.status.muted;
                if (c.browser.msie && Number(c.browser.version) <= 8) {
                    var d = '<object id="' + this.internal.flash.id + '"';
                    d += ' classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
                    d += ' codebase="' + document.URL.substring(0, document.URL.indexOf(":")) + '://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"';
                    d += ' type="application/x-shockwave-flash"';
                    d += ' width="0" height="0">';
                    d += "</object>";
                    var f = [];
                    f[0] = '<param name="movie" value="' + this.internal.flash.swf + '" />';
                    f[1] = '<param name="quality" value="high" />';
                    f[2] = '<param name="FlashVars" value="' + b + '" />';
                    f[3] = '<param name="allowScriptAccess" value="always" />';
                    f[4] = '<param name="bgcolor" value="' + this.options.backgroundColor + '" />';
                    b = document.createElement(d);
                    for (d = 0; d < f.length; d++) b.appendChild(document.createElement(f[d]));
                    this.element.append(b)
                } else {
                    f = '<embed name="' + this.internal.flash.id + '" id="' + this.internal.flash.id + '" src="' + this.internal.flash.swf + '"';
                    f += ' width="0" height="0" bgcolor="' + this.options.backgroundColor + '"';
                    f += ' quality="high" FlashVars="' + b + '"';
                    f += ' allowScriptAccess="always"';
                    f += ' type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
                    this.element.append(f)
                }
                this.internal.flash.jq = c("#" + this.internal.flash.id);
                this.internal.flash.jq.css({
                    width: "0px",
                    height: "0px"
                })
            }
            if (this.html.used) {
                if (this.html.audio.available) {
                    this._addHtmlEventListeners(this.htmlElement.audio, this.html.audio);
                    this.element.append(this.htmlElement.audio);
                    this.internal.audio.jq = c("#" + this.internal.audio.id)
                }

                if (this.html.video.available) {
                    this._addHtmlEventListeners(this.htmlElement.video, this.html.video);
                    this.element.append(this.htmlElement.video);
                    this.internal.video.jq = c("#" + this.internal.video.id);
                    this.internal.video.jq.css({
                        width: "0px",
                        height: "0px"
                    })
                }
            }
            this.html.used && !this.flash.used && window.setTimeout(function () {
                a.internal.ready = true;
                a.version.flash = "n/a";
                a._trigger(c.jPlayer.event.ready)
            }, 100);
            c.each(this.options.cssSelector, function (e, g) {
                a._cssSelector(e, g)
            });
            this._updateInterface();
            this._updateButtons(false);
            this._updateVolume(this.status.volume);
            this._updateMute(this.status.muted);
            this.css.jq.videoPlay.length && this.css.jq.videoPlay.hide();
            c.jPlayer.prototype.count++
        },
        destroy: function () {
            this._resetStatus();
            this._updateInterface();
            this._seeked();
            this.css.jq.currentTime.length && this.css.jq.currentTime.text("");
            this.css.jq.duration.length && this.css.jq.duration.text("");
            this.status.srcSet && this.pause();
            c.each(this.css.jq, function (a, b) {
                b.unbind(".jPlayer")
            });
            this.element.removeData("jPlayer");
            this.element.unbind(".jPlayer");
            this.element.empty();
            this.instances[this.internal.instance] = h
        },
        enable: function () {},
        disable: function () {},
        _addHtmlEventListeners: function (a, b) {
            var d = this;
            a.preload = this.options.preload;
            a.muted = this.options.muted;
            a.addEventListener("progress", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._getHtmlStatus(a);
                    d._updateInterface();
                    d._trigger(c.jPlayer.event.progress)
                }
            }, false);
            a.addEventListener("timeupdate", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._getHtmlStatus(a);
                    d._updateInterface();
                    d._trigger(c.jPlayer.event.timeupdate)
                }
            }, false);
            a.addEventListener("durationchange", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d.status.duration = this.duration;
                    d._getHtmlStatus(a);
                    d._updateInterface();
                    d._trigger(c.jPlayer.event.durationchange)
                }
            }, false);
            a.addEventListener("play", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._updateButtons(true);
                    d._trigger(c.jPlayer.event.play)
                }
            }, false);
            a.addEventListener("playing", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._updateButtons(true);
                    d._seeked();
                    d._trigger(c.jPlayer.event.playing)
                }
            }, false);
            a.addEventListener("pause", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._updateButtons(false);
                    d._trigger(c.jPlayer.event.pause)
                }
            }, false);
            a.addEventListener("waiting", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._seeking();
                    d._trigger(c.jPlayer.event.waiting)
                }
            }, false);
            a.addEventListener("canplay", function () {
                if (b.gate && !d.status.waitForLoad) {
                    a.volume = d._volumeFix(d.status.volume);
                    d._trigger(c.jPlayer.event.canplay)
                }
            }, false);
            a.addEventListener("seeking", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._seeking();
                    d._trigger(c.jPlayer.event.seeking)
                }
            }, false);
            a.addEventListener("seeked", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._seeked();
                    d._trigger(c.jPlayer.event.seeked)
                }
            }, false);
            a.addEventListener("suspend", function () {
                if (b.gate && !d.status.waitForLoad) {
                    d._seeked();
                    d._trigger(c.jPlayer.event.suspend)
                }
            }, false);
            a.addEventListener("ended", function () {
                if (b.gate && !d.status.waitForLoad) {
                    if (!c.jPlayer.browser.webkit) d.htmlElement.media.currentTime = 0;
                    d.htmlElement.media.pause();
                    d._updateButtons(false);
                    d._getHtmlStatus(a, true);
                    d._updateInterface();
                    d._trigger(c.jPlayer.event.ended)
                }
            }, false);
            a.addEventListener("error", function () {
                if (b.gate && !d.status.waitForLoad) {


                }
            }, false);
            c.each(c.jPlayer.htmlEvent, function (f, e) {
                a.addEventListener(this, function () {
                    b.gate && !d.status.waitForLoad && d._trigger(c.jPlayer.event[e])
                }, false)
            })
        },
        _getHtmlStatus: function (a, b) {
            var d = 0,
                f = 0,
                e = 0,
                g = 0;
            d = a.currentTime;
            f = this.status.duration > 0 ? 100 * d / this.status.duration : 0;
            if (typeof a.seekable === "object" && a.seekable.length > 0) {
                e = this.status.duration > 0 ? 100 * a.seekable.end(a.seekable.length - 1) / this.status.duration : 100;
                g = 100 * a.currentTime / a.seekable.end(a.seekable.length - 1)
            } else {
                e = 100;
                g = f
            }
            if (b) f = g = d = 0;
            this.status.seekPercent = e;
            this.status.currentPercentRelative = g;
            this.status.currentPercentAbsolute = f;
            this.status.currentTime = d
        },
        _resetStatus: function () {
            this.status = c.extend({}, this.status, c.jPlayer.prototype.status)
        },
        _trigger: function (a, b, d) {
            a = c.Event(a);
            a.jPlayer = {};
            a.jPlayer.version = c.extend({}, this.version);
            a.jPlayer.status = c.extend(true, {}, this.status);
            a.jPlayer.html = c.extend(true, {}, this.html);
            a.jPlayer.flash = c.extend(true, {}, this.flash);
            if (b) a.jPlayer.error = c.extend({}, b);
            if (d) a.jPlayer.warning = c.extend({}, d);
            this.element.trigger(a)
        },
        jPlayerFlashEvent: function (a, b) {
            if (a === c.jPlayer.event.ready && !this.internal.ready) {
                this.internal.ready = true;
                this.version.flash = b.version;
                this.version.needFlash !== this.version.flash && this._error({
                    type: c.jPlayer.error.VERSION,
                    context: this.version.flash,
                    message: c.jPlayer.errorMsg.VERSION + this.version.flash,
                    hint: c.jPlayer.errorHint.VERSION
                });
                this._trigger(a)
            }
            if (this.flash.gate) switch (a) {
            case c.jPlayer.event.progress:
                this._getFlashStatus(b);
                this._updateInterface();
                this._trigger(a);
                break;
            case c.jPlayer.event.timeupdate:
                this._getFlashStatus(b);
                this._updateInterface();
                this._trigger(a);
                break;
            case c.jPlayer.event.play:
                this._seeked();
                this._updateButtons(true);
                this._trigger(a);
                break;
            case c.jPlayer.event.pause:
                this._updateButtons(false);
                this._trigger(a);
                break;
            case c.jPlayer.event.ended:
                this._updateButtons(false);
                this._trigger(a);
                break;
            case c.jPlayer.event.error:
                this.status.waitForLoad = true;
                this.status.waitForPlay = true;
                this.status.video && this.internal.flash.jq.css({
                    width: "0px",
                    height: "0px"
                });
                this._validString(this.status.media.poster) && this.internal.poster.jq.show();
                this.css.jq.videoPlay.length && this.css.jq.videoPlay.show();
                this.status.video ? this._flash_setVideo(this.status.media) : this._flash_setAudio(this.status.media);
                this._error({
                    type: c.jPlayer.error.URL,
                    context: b.src,
                    message: c.jPlayer.errorMsg.URL,
                    hint: c.jPlayer.errorHint.URL
                });
                break;
            case c.jPlayer.event.seeking:
                this._seeking();
                this._trigger(a);
                break;
            case c.jPlayer.event.seeked:
                this._seeked();
                this._trigger(a);
                break;
            default:
                this._trigger(a)
            }
            return false
        },
        _getFlashStatus: function (a) {
            this.status.seekPercent = a.seekPercent;
            this.status.currentPercentRelative = a.currentPercentRelative;
            this.status.currentPercentAbsolute = a.currentPercentAbsolute;
            this.status.currentTime = a.currentTime;
            this.status.duration = a.duration
        },
        _updateButtons: function (a) {
            this.status.paused = !a;
            if (this.css.jq.play.length && this.css.jq.pause.length) if (a) {
                this.css.jq.play.hide();
                this.css.jq.pause.show()
            } else {
                this.css.jq.play.show();
                this.css.jq.pause.hide()
            }
        },
        _updateInterface: function () {
            this.css.jq.seekBar.length && this.css.jq.seekBar.width(this.status.seekPercent + "%");
            this.css.jq.playBar.length && this.css.jq.playBar.width(this.status.currentPercentRelative + "%");
            this.css.jq.currentTime.length && this.css.jq.currentTime.text(c.jPlayer.convertTime(this.status.currentTime));
            this.css.jq.duration.length && this.css.jq.duration.text(c.jPlayer.convertTime(this.status.duration))
        },
        _seeking: function () {
            this.css.jq.seekBar.length && this.css.jq.seekBar.addClass("jp-seeking-bg")
        },
        _seeked: function () {
            this.css.jq.seekBar.length && this.css.jq.seekBar.removeClass("jp-seeking-bg")
        },
        setMedia: function (a) {
            var b = this;
            this._seeked();
            clearTimeout(this.internal.htmlDlyCmdId);
            var d = this.html.audio.gate,
                f = this.html.video.gate,
                e = false;
            c.each(this.formats, function (g, i) {
                var j = b.format[i].media === "video";
                c.each(b.solutions, function (n, k) {
                    if (b[k].support[i] && b._validString(a[i])) {
                        var l = k === "html";
                        if (j) if (l) {
                            b.html.audio.gate = false;
                            b.html.video.gate = true;
                            b.flash.gate = false
                        } else {
                            b.html.audio.gate = false;
                            b.html.video.gate = false;
                            b.flash.gate = true
                        } else if (l) {
                            b.html.audio.gate = true;
                            b.html.video.gate = false;
                            b.flash.gate = false
                        } else {
                            b.html.audio.gate = false;
                            b.html.video.gate = false;
                            b.flash.gate = true
                        }
                        if (b.flash.active || b.html.active && b.flash.gate || d === b.html.audio.gate && f === b.html.video.gate) b.clearMedia();
                        else if (d !== b.html.audio.gate && f !== b.html.video.gate) {
                            b._html_pause();
                            b.status.video && b.internal.video.jq.css({
                                width: "0px",
                                height: "0px"
                            });
                            b._resetStatus()
                        }
                        if (j) {
                            if (l) {
                                b._html_setVideo(a);
                                b.html.active = true;
                                b.flash.active = false
                            } else {
                                b._flash_setVideo(a);
                                b.html.active = false;
                                b.flash.active = true
                            }
                            b.css.jq.videoPlay.length && b.css.jq.videoPlay.show();
                            b.status.video = true
                        } else {
                            if (l) {
                                b._html_setAudio(a);
                                b.html.active = true;
                                b.flash.active = false
                            } else {
                                b._flash_setAudio(a);
                                b.html.active = false;
                                b.flash.active = true
                            }
                            b.css.jq.videoPlay.length && b.css.jq.videoPlay.hide();
                            b.status.video = false
                        }
                        e = true;
                        return false
                    }
                });
                if (e) return false
            });
            if (e) {
                if (this._validString(a.poster)) if (this.htmlElement.poster.src !== a.poster) this.htmlElement.poster.src = a.poster;
                else this.internal.poster.jq.show();
                else this.internal.poster.jq.hide();
                this.status.srcSet = true;
                this.status.media = c.extend({}, a);
                this._updateButtons(false);
                this._updateInterface()
            } else {
                this.status.srcSet && !this.status.waitForPlay && this.pause();
                this.html.audio.gate = false;
                this.html.video.gate = false;
                this.flash.gate = false;
                this.html.active = false;
                this.flash.active = false;
                this._resetStatus();
                this._updateInterface();
                this._updateButtons(false);
                this.internal.poster.jq.hide();
                this.html.used && this.require.video && this.internal.video.jq.css({
                    width: "0px",
                    height: "0px"
                });
                this.flash.used && this.internal.flash.jq.css({
                    width: "0px",
                    height: "0px"
                });
                this._error({
                    type: c.jPlayer.error.NO_SUPPORT,
                    context: "{supplied:'" + this.options.supplied + "'}",
                    message: c.jPlayer.errorMsg.NO_SUPPORT,
                    hint: c.jPlayer.errorHint.NO_SUPPORT
                })
            }
        },
        clearMedia: function () {
            this._resetStatus();
            this._updateButtons(false);
            this.internal.poster.jq.hide();
            clearTimeout(this.internal.htmlDlyCmdId);
            if (this.html.active) this._html_clearMedia();
            else this.flash.active && this._flash_clearMedia()
        },
        load: function () {
            if (this.status.srcSet) if (this.html.active) this._html_load();
            else this.flash.active && this._flash_load();
            else this._urlNotSetError("load")
        },
        play: function (a) {
            a = typeof a === "number" ? a : NaN;
            if (this.status.srcSet) if (this.html.active) this._html_play(a);
            else this.flash.active && this._flash_play(a);
            else this._urlNotSetError("play")
        },
        videoPlay: function () {
            this.play()
        },
        pause: function (a) {
            a = typeof a === "number" ? a : NaN;
            if (this.status.srcSet) if (this.html.active) this._html_pause(a);
            else this.flash.active && this._flash_pause(a);
            else this._urlNotSetError("pause")
        },
        pauseOthers: function () {
            var a = this;
            c.each(this.instances, function (b, d) {
                a.element !== d && d.data("jPlayer").status.srcSet && d.jPlayer("pause")
            })
        },
        stop: function () {
            if (this.status.srcSet) if (this.html.active) this._html_pause(0);
            else this.flash.active && this._flash_pause(0);
            else this._urlNotSetError("stop")
        },
        playHead: function (a) {
            a = this._limitValue(a, 0, 100);
            if (this.status.srcSet) if (this.html.active) this._html_playHead(a);
            else this.flash.active && this._flash_playHead(a);
            else this._urlNotSetError("playHead")
        },
        mute: function () {
            this.status.muted = true;
            this.html.used && this._html_mute(true);
            this.flash.used && this._flash_mute(true);
            this._updateMute(true);
            this._updateVolume(0);
            this._trigger(c.jPlayer.event.volumechange)
        },
        unmute: function () {
            this.status.muted = false;
            this.html.used && this._html_mute(false);
            this.flash.used && this._flash_mute(false);
            this._updateMute(false);
            this._updateVolume(this.status.volume);
            this._trigger(c.jPlayer.event.volumechange)
        },
        _updateMute: function (a) {
            if (this.css.jq.mute.length && this.css.jq.unmute.length) if (a) {
                this.css.jq.mute.hide();
                this.css.jq.unmute.show()
            } else {
                this.css.jq.mute.show();
                this.css.jq.unmute.hide()
            }
        },
        volume: function (a) {
            a = this._limitValue(a, 0, 1);
            this.status.volume = a;
            this.html.used && this._html_volume(a);
            this.flash.used && this._flash_volume(a);
            this.status.muted || this._updateVolume(a);
            this._trigger(c.jPlayer.event.volumechange)
        },
        volumeBar: function (a) {
            if (!this.status.muted && this.css.jq.volumeBar) {
                var b = this.css.jq.volumeBar.offset();
                a = a.pageX - b.left;
                b = this.css.jq.volumeBar.width();
                this.volume(a / b)
            }
        },
        volumeBarValue: function (a) {
            this.volumeBar(a)
        },
        _updateVolume: function (a) {
            this.css.jq.volumeBarValue.length && this.css.jq.volumeBarValue.width(a * 100 + "%")
        },
        _volumeFix: function (a) {
            var b = 0.0010 * Math.random();
            return a + (a < 0.5 ? b : -b)
        },
        _cssSelectorAncestor: function (a, b) {
            this.options.cssSelectorAncestor = a;
            b && c.each(this.options.cssSelector, function (d, f) {
                self._cssSelector(d, f)
            })
        },
        _cssSelector: function (a, b) {
            var d = this;
            if (typeof b === "string") if (c.jPlayer.prototype.options.cssSelector[a]) {
                this.css.jq[a] && this.css.jq[a].length && this.css.jq[a].unbind(".jPlayer");
                this.options.cssSelector[a] = b;
                this.css.cs[a] = this.options.cssSelectorAncestor + " " + b;
                this.css.jq[a] = b ? c(this.css.cs[a]) : [];
                this.css.jq[a].length && this.css.jq[a].bind("click.jPlayer", function (f) {
                    d[a](f);
                    c(this).blur();
                    return false
                });
                b && this.css.jq[a].length !== 1 && this._warning({
                    type: c.jPlayer.warning.CSS_SELECTOR_COUNT,
                    context: this.css.cs[a],
                    message: c.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.css.jq[a].length + " found for " + a + " method.",
                    hint: c.jPlayer.warningHint.CSS_SELECTOR_COUNT
                })
            } else this._warning({
                type: c.jPlayer.warning.CSS_SELECTOR_METHOD,
                context: a,
                message: c.jPlayer.warningMsg.CSS_SELECTOR_METHOD,
                hint: c.jPlayer.warningHint.CSS_SELECTOR_METHOD
            });
            else this._warning({
                type: c.jPlayer.warning.CSS_SELECTOR_STRING,
                context: b,
                message: c.jPlayer.warningMsg.CSS_SELECTOR_STRING,
                hint: c.jPlayer.warningHint.CSS_SELECTOR_STRING
            })
        },
        seekBar: function (a) {
            if (this.css.jq.seekBar) {
                var b = this.css.jq.seekBar.offset();
                a = a.pageX - b.left;
                b = this.css.jq.seekBar.width();
                this.playHead(100 * a / b)
            }
        },
        playBar: function (a) {
            this.seekBar(a)
        },
        currentTime: function () {},
        duration: function () {},
        option: function (a, b) {
            var d = a;
            if (arguments.length === 0) return c.extend(true, {}, this.options);
            if (typeof a === "string") {
                var f = a.split(".");
                if (b === h) {
                    for (var e = c.extend(true, {}, this.options), g = 0; g < f.length; g++) if (e[f[g]] !== h) e = e[f[g]];
                    else {
                        this._warning({
                            type: c.jPlayer.warning.OPTION_KEY,
                            context: a,
                            message: c.jPlayer.warningMsg.OPTION_KEY,
                            hint: c.jPlayer.warningHint.OPTION_KEY
                        });
                        return h
                    }
                    return e
                }
                e = d = {};
                for (g = 0; g < f.length; g++) if (g < f.length - 1) {
                    e[f[g]] = {};
                    e = e[f[g]]
                } else e[f[g]] = b
            }
            this._setOptions(d);
            return this
        },
        _setOptions: function (a) {
            var b = this;
            c.each(a, function (d, f) {
                b._setOption(d, f)
            });
            return this
        },
        _setOption: function (a, b) {
            var d = this;
            switch (a) {
            case "cssSelectorAncestor":
                this.options[a] = b;
                c.each(d.options.cssSelector, function (f, e) {
                    d._cssSelector(f, e)
                });
                break;
            case "cssSelector":
                c.each(b, function (f, e) {
                    d._cssSelector(f, e)
                })
            }
            return this
        },
        resize: function (a) {
            this.html.active && this._resizeHtml(a);
            this.flash.active && this._resizeFlash(a);
            this._trigger(c.jPlayer.event.resize)
        },
        _resizePoster: function () {},
        _resizeHtml: function () {},
        _resizeFlash: function (a) {
            this.internal.flash.jq.css({
                width: a.width,
                height: a.height
            })
        },
        _html_initMedia: function () {
            this.status.srcSet && !this.status.waitForPlay && this.htmlElement.media.pause();
            this.options.preload !== "none" && this._html_load();
            this._trigger(c.jPlayer.event.timeupdate)
        },
        _html_setAudio: function (a) {
            var b = this;
            c.each(this.formats, function (d, f) {
                if (b.html.support[f] && a[f]) {
                    b.status.src = a[f];
                    b.status.format[f] = true;
                    b.status.formatType = f;
                    return false
                }
            });
            this.htmlElement.media = this.htmlElement.audio;
            this._html_initMedia()
        },
        _html_setVideo: function (a) {
            var b = this;
            c.each(this.formats, function (d, f) {
                if (b.html.support[f] && a[f]) {
                    b.status.src = a[f];
                    b.status.format[f] = true;
                    b.status.formatType = f;
                    return false
                }
            });
            this.htmlElement.media = this.htmlElement.video;
            this._html_initMedia()
        },
        _html_clearMedia: function () {
            if (this.htmlElement.media) {
                this.htmlElement.media.id === this.internal.video.id && this.internal.video.jq.css({
                    width: "0px",
                    height: "0px"
                });
                this.htmlElement.media.pause();
                this.htmlElement.media.src = "";
                c.browser.msie && Number(c.browser.version) >= 9 || this.htmlElement.media.load()
            }
        },
        _html_load: function () {
            if (this.status.waitForLoad) {
                this.status.waitForLoad = false;
                this.htmlElement.media.src = this.status.src;
                try {
                    this.htmlElement.media.load()
                } catch (a) {}
            }
            clearTimeout(this.internal.htmlDlyCmdId)
        },
        _html_play: function (a) {
            var b = this;
            this._html_load();
            this.htmlElement.media.play();
            if (!isNaN(a)) try {
                this.htmlElement.media.currentTime = a
            } catch (d) {
                this.internal.htmlDlyCmdId = setTimeout(function () {
                    b.play(a)
                }, 100);
                return
            }
            this._html_checkWaitForPlay()
        },
        _html_pause: function (a) {
            var b = this;
            a > 0 ? this._html_load() : clearTimeout(this.internal.htmlDlyCmdId);
            this.htmlElement.media.pause();
            if (!isNaN(a)) try {
                this.htmlElement.media.currentTime = a
            } catch (d) {
                this.internal.htmlDlyCmdId = setTimeout(function () {
                    b.pause(a)
                }, 100);
                return
            }
            a > 0 && this._html_checkWaitForPlay()
        },
        _html_playHead: function (a) {
            var b = this;
            this._html_load();
            try {
                if (typeof this.htmlElement.media.seekable === "object" && this.htmlElement.media.seekable.length > 0) this.htmlElement.media.currentTime = a * this.htmlElement.media.seekable.end(this.htmlElement.media.seekable.length - 1) / 100;
                else if (this.htmlElement.media.duration > 0 && !isNaN(this.htmlElement.media.duration)) this.htmlElement.media.currentTime = a * this.htmlElement.media.duration / 100;
                else throw "e";
            } catch (d) {
                this.internal.htmlDlyCmdId = setTimeout(function () {
                    b.playHead(a)
                }, 100);
                return
            }
            this.status.waitForLoad || this._html_checkWaitForPlay()
        },
        _html_checkWaitForPlay: function () {
            if (this.status.waitForPlay) {
                this.status.waitForPlay = false;
                this.css.jq.videoPlay.length && this.css.jq.videoPlay.hide();
                if (this.status.video) {
                    this.internal.poster.jq.hide();
                    this.internal.video.jq.css({
                        width: this.status.width,
                        height: this.status.height
                    })
                }
            }
        },
        _html_volume: function (a) {
            if (this.html.audio.available) this.htmlElement.audio.volume = a;
            if (this.html.video.available) this.htmlElement.video.volume = a
        },
        _html_mute: function (a) {
            if (this.html.audio.available) this.htmlElement.audio.muted = a;
            if (this.html.video.available) this.htmlElement.video.muted = a
        },
        _flash_setAudio: function (a) {
            var b = this;
            try {
                c.each(this.formats, function (f, e) {
                    if (b.flash.support[e] && a[e]) {
                        switch (e) {
                        case "m4a":
                            b._getMovie().fl_setAudio_m4a(a[e]);
                            break;
                        case "mp3":
                            b._getMovie().fl_setAudio_mp3(a[e])
                        }
                        b.status.src = a[e];
                        b.status.format[e] = true;
                        b.status.formatType = e;
                        return false
                    }
                });
                if (this.options.preload === "auto") {
                    this._flash_load();
                    this.status.waitForLoad = false
                }
            } catch (d) {
                this._flashError(d)
            }
        },
        _flash_setVideo: function (a) {
            var b = this;
            try {
                c.each(this.formats, function (f, e) {
                    if (b.flash.support[e] && a[e]) {
                        switch (e) {
                        case "m4v":
                            b._getMovie().fl_setVideo_m4v(a[e])
                        }
                        b.status.src = a[e];
                        b.status.format[e] = true;
                        b.status.formatType = e;
                        return false
                    }
                });
                if (this.options.preload === "auto") {
                    this._flash_load();
                    this.status.waitForLoad = false
                }
            } catch (d) {
                this._flashError(d)
            }
        },
        _flash_clearMedia: function () {
            this.internal.flash.jq.css({
                width: "0px",
                height: "0px"
            });
            try {
                this._getMovie().fl_clearMedia()
            } catch (a) {
                this._flashError(a)
            }
        },
        _flash_load: function () {
            try {
                this._getMovie().fl_load()
            } catch (a) {
                this._flashError(a)
            }
            this.status.waitForLoad = false
        },
        _flash_play: function (a) {
            try {
                this._getMovie().fl_play(a)
            } catch (b) {
                this._flashError(b)
            }
            this.status.waitForLoad = false;
            this._flash_checkWaitForPlay()
        },
        _flash_pause: function (a) {
            try {
                this._getMovie().fl_pause(a)
            } catch (b) {
                this._flashError(b)
            }
            if (a > 0) {
                this.status.waitForLoad = false;
                this._flash_checkWaitForPlay()
            }
        },
        _flash_playHead: function (a) {
            try {
                this._getMovie().fl_play_head(a)
            } catch (b) {
                this._flashError(b)
            }
            this.status.waitForLoad || this._flash_checkWaitForPlay()
        },
        _flash_checkWaitForPlay: function () {
            if (this.status.waitForPlay) {
                this.status.waitForPlay = false;
                this.css.jq.videoPlay.length && this.css.jq.videoPlay.hide();
                if (this.status.video) {
                    this.internal.poster.jq.hide();
                    this.internal.flash.jq.css({
                        width: this.status.width,
                        height: this.status.height
                    })
                }
            }
        },
        _flash_volume: function (a) {
            try {
                this._getMovie().fl_volume(a)
            } catch (b) {
                this._flashError(b)
            }
        },
        _flash_mute: function (a) {
            try {
                this._getMovie().fl_mute(a)
            } catch (b) {
                this._flashError(b)
            }
        },
        _getMovie: function () {
            return document[this.internal.flash.id]
        },
        _checkForFlash: function (a) {
            var b = false,
                d;
            if (window.ActiveXObject) try {
                new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + a);
                b = true
            } catch (f) {} else if (navigator.plugins && navigator.mimeTypes.length > 0) if (d = navigator.plugins["Shockwave Flash"]) if (navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/, "$1") >= a) b = true;
            return c.browser.msie && Number(c.browser.version) >= 9 ? false : b
        },
        _validString: function (a) {
            return a && typeof a === "string"
        },
        _limitValue: function (a, b, d) {
            return a < b ? b : a > d ? d : a
        },
        _urlNotSetError: function (a) {
            this._error({
                type: c.jPlayer.error.URL_NOT_SET,
                context: a,
                message: c.jPlayer.errorMsg.URL_NOT_SET,
                hint: c.jPlayer.errorHint.URL_NOT_SET
            })
        },
        _flashError: function (a) {
            this._error({
                type: c.jPlayer.error.FLASH,
                context: this.internal.flash.swf,
                message: c.jPlayer.errorMsg.FLASH + a.message,
                hint: c.jPlayer.errorHint.FLASH
            })
        },
        _error: function (a) {
            this._trigger(c.jPlayer.event.error, a);
            if (this.options.errorAlerts) this._alert("Error!" + (a.message ? "\n\n" + a.message : "") + (a.hint ? "\n\n" + a.hint : "") + "\n\nContext: " + a.context)
        },
        _warning: function (a) {
            this._trigger(c.jPlayer.event.warning, h, a);
            if (this.options.errorAlerts) this._alert("Warning!" + (a.message ? "\n\n" + a.message : "") + (a.hint ? "\n\n" + a.hint : "") + "\n\nContext: " + a.context)
        },
        _alert: function (a) {
            alert("jPlayer " + this.version.script + " : id='" + this.internal.self.id + "' : " + a)
        }
    };
    c.jPlayer.error = {
        FLASH: "e_flash",
        NO_SOLUTION: "e_no_solution",
        NO_SUPPORT: "e_no_support",
        URL: "e_url",
        URL_NOT_SET: "e_url_not_set",
        VERSION: "e_version"
    };
    c.jPlayer.errorMsg = {
        FLASH: "jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",
        NO_SOLUTION: "No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.",
        NO_SUPPORT: "It is not possible to play any media format provided in setMedia() on this browser using your current options.",
        URL: "Media URL could not be loaded.",
        URL_NOT_SET: "Attempt to issue media playback commands, while no media url is set.",
        VERSION: "jPlayer " + c.jPlayer.prototype.version.script + " needs Jplayer.swf version " + c.jPlayer.prototype.version.needFlash + " but found "
    };
    c.jPlayer.errorHint = {
        FLASH: "Check your swfPath option and that Jplayer.swf is there.",
        NO_SOLUTION: "Review the jPlayer options: support and supplied.",
        NO_SUPPORT: "Video or audio formats defined in the supplied option are missing.",
        URL: "Check media URL is valid.",
        URL_NOT_SET: "Use setMedia() to set the media URL.",
        VERSION: "Update jPlayer files."
    };
    c.jPlayer.warning = {
        CSS_SELECTOR_COUNT: "e_css_selector_count",
        CSS_SELECTOR_METHOD: "e_css_selector_method",
        CSS_SELECTOR_STRING: "e_css_selector_string",
        OPTION_KEY: "e_option_key"
    };
    c.jPlayer.warningMsg = {
        CSS_SELECTOR_COUNT: "The number of methodCssSelectors found did not equal one: ",
        CSS_SELECTOR_METHOD: "The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",
        CSS_SELECTOR_STRING: "The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",
        OPTION_KEY: "The option requested in jPlayer('option') is undefined."
    };
    c.jPlayer.warningHint = {
        CSS_SELECTOR_COUNT: "Check your css selector and the ancestor.",
        CSS_SELECTOR_METHOD: "Check your method name.",
        CSS_SELECTOR_STRING: "Check your css selector is a string.",
        OPTION_KEY: "Check your option name."
    }
})(jQuery);
