View file xmyx.ru/files/js/main.Audio.js

File size: 21.83Kb
/**
 * author: koder_alex
 */
var audio = function () {
    var e = !1, t = !1, a = !1, n = !1, o = function (t) {
            (e || n !== !1) && (e = !1, v && n === !1 || (a = !0, s.pause())), cancelEvent(t), removeEvent(s, "play", o), removeEvent(document, isTouch ? "touchstart" : "click", r);
        }, i = function () {
            n !== !1 && n();
        }, r = function () {
            t && (t = !1, e = !0, s.play(),removeEvent(document, isTouch ? "touchstart" : "click", r));
        }, s = b(), l = Math.random().toString(36).substr(2), c = [], u = null, d = {}, p = "", v = !1, f = !1, g = !1,
        h = !1, _ = null, m = !1, y = !1;

    function b(t) {
        var s = window.Audio ? new Audio : ce("audio");
        s.onerror = function(e){
            audio.pause();
        };
        return s.autobuffer = !0, s.muted = !1, t && (s.volume = t.volume, removeEvent(t, "play", w), removeEvent(t, "pause", C), removeEvent(t, "progress", k), removeEvent(t, "timeupdate", x), removeEvent(t, "ended", S), removeEvent(t, "play", o), removeEvent(t, "progress canplaythrough", i), removeEvent(document, isTouch ? "touchstart" : "click", r), t.muted = !0, t.pause(), t.src = null), h = !1, f = !1, g = !1, e = !1, a = !1, n = !1, addEvent(s, "play", w), addEvent(s, "pause", C), addEvent(s, "progress",
            k), addEvent(s, "timeupdate", x), addEvent(s, "ended", S), addEvent(s, "play", o), addEvent(s, "progress canplaythrough", i), addEvent(document, isTouch ? "touchstart" : "click", r), s;
    }

    function w() {
        v || (v = !0, audio.onPlay(!0), ssSet("audio_play", "1"), clearTimeout(_), _ = setTimeout(E, 100));
    }

    function C() {
        return a ? void(a = !1) : void(v && (v = !1, audio.onPause(!0), ssSet("audio_play", "0"), clearTimeout(_)));
    }

    function k() {
        audio.onProgress(!0);
    }

    function x() {
        a || (audio.onProgress(!0), audio.onPositionChanged(!0, audio.position(), audio.duration()), ssSet("audio_pos", audio.position()), !h && s.duration - s.currentTime < .5 && (h = !0), f && (f = !1, audio.next()));
    }

    function S() {
        audio.onEnded(!0), h ? (h = !1, audio.next()) : f = !0;
    }

    function B() {
        return c[u] || !1;
    }

    function z() {
        return B().id || !1;
    }

    function T(e) {
        e && (s.src = e.src, ssSet("audio_src", e.src), s.load(), audio.onSelect(!0, e));
        if(e) {
            var l = ge("listenMusic");
                l && (hide(ge('pp_status_link')),hide(ge('pp_status_info')), show(l), val(geByClass1("ai_artist", l), e.artist), val(geByClass1("ai_title", l), e.title));
                var li = ge("listenMusicInfo");
                li && (val(geByClass1("ai_artist", li), e.artist), val(geByClass1("ai_title", li), e.title));

        }
    }

    function E() {
        if (v) {
            var e = lsGet("audio_current_player");
            l != e ? audio.pause() : _ = setTimeout(E, 100);
        }
    }

    function j() {
        var e = z();
        ssSet("audio_id", e), ssSet("audio_pos", 0), m && (document.cookie = m + "=" + e + "; expires=" + (new Date(timeNow() + 864e5)).toUTCString() + "; path=" + y);
    }

    function A(e) {
        ssSet("audio_query", e), m && (document.cookie = m + "q=" + encodeURIComponent(e) + "; expires=" + (new Date(timeNow() + 864e5)).toUTCString() + "; path=" + y);
    }
    var checkRadio = null;
    function isRadio(){
        if(checkRadio === null)
            checkRadio = (ge('radio_container') === null);
        return checkRadio;
    }
    var repeat = false;
    return {
        init: function (e) {
            return audio.support ? (e.cookie && (m = e.cookie, y = e.cookie_path || "/"), void onDOMReady(function () {
                var a = ssGet("audio_id");
                if (a) {
                    var n = ssGet("audio_pos"), o = ssGet("audio_vol"), i = ssGet("audio_play");
                    audio.select(a), "1" == i && (audio.isRadio() && (null !== n && audio.position(n)), null !== o && audio.volume(o), t = !0, audio.play());
                }
            })) : !1;
        },
        isRadio : isRadio,
        support: s.canPlayType && s.canPlayType("audio/mpeg") && "no" != s.canPlayType("audio/mpeg") || !1,
        onPlay: se(z),
        onPause: se(z),
        onDeselect: se(z, function () {
            return audio.duration();
        }),
        onSelect: se(),
        onProgress: se(z, function () {
            return audio.loaded();
        }, function () {
            return audio.duration();
        }),
        onPositionChanged: se(z),
        onVolumeChanged: se(z, function () {
            return s.volume;
        }),
        onEnded: se(z),
        onNotFoundError: se(),
        onEmptyPlaylistError: se(),
        getCurrent: B,
        getCurrentId: z,
        operate: function (e) {
            return audio.support ? void(!e || c[u] && e == c[u].id ? v ? audio.pause() : audio.play() : audio.play(e)) : !1;
        },
        playing: function () {
            return v;
        },
        select: function (e) {
            if (!audio.support) {
                return !1;
            }
            if (e) {
                return c.length ? c[d[e]] ? (z() && audio.onDeselect(!0), u = d[e], T(c[u]), j(), !0) : void audio.onNotFoundError(!0, e) : void audio.onEmptyPlaylistError(!0, e);
            }
        },
        play: function (e) {
            if (!audio.support) {
                return !1;
            }
            if (e) {
                if (v && audio.pause(), !audio.select(e)) {
                    return;
                }
                try {
                    s.currentTime = .01;
                } catch (t$0) {
                }
            }
            if(audio.isRadio() === false) {
                s.currentTime = .01;
            }

            v || (s.muted = !1, s.play(), v = !0, audio.onPlay(!0),ssSet("audio_play", "1"), lsSet("audio_current_player", l));
        },
        pause: function () {
            return audio.support ? void(v && (audio.isRadio() === false && (s.currentTime = .01), s.pause(), v = !1, audio.onPause(!0), ssSet("audio_play", "0"))) : !1;
        },
        position: function (e, t) {
            if (!audio.support) {
                return !1;
            }
            if ("undefined" == typeof e) {
                return s.currentTime;
            }
            t && (e = audio.duration() * e), e = Math.max(0, Math.min(e, audio.duration()));
            var a = v;
            a && (v = !1, s.pause());
            try {
                s.currentTime = e, audio.onPositionChanged(!0, audio.position(), audio.duration()), ssSet("audio_pos", e), a && (v = !0, s.muted = !1, s.play().catch(function(e){
                    audio.next();
                }));
            } catch (o$1) {
                audio.onPositionChanged(!0, e, audio.duration()), n = function () {
                    n = !1, audio.position(e);
                }, a && (v = !0);
            }
        },
        volume: function (e) {
            if (!audio.support) {
                return !1;
            }
            if ("undefined" == typeof e) {
                return s.volume;
            }
            try {
                s.volume = e || 0;
            } catch (t$2) {
            }
            audio.onVolumeChanged(!0), ssSet("audio_vol", e || 0);
        },
        loaded: function () {
            return s.buffered && s.buffered.length && s.buffered.end(s.buffered.length - 1) || 0;
        },
        duration: function () {
            return c[u] && c[u].dur || s.duration || 0;
        },
        next: function () {
            return audio.support ? (v && audio.pause(), audio.onDeselect(!0), ++u >= c.length && (u = 0), T(c[u]), j(), t = !0, void audio.play()) : !1;
        },
        prev: function () {
            return audio.support ? (v && audio.pause(), audio.onDeselect(!0), --u <= 0 && (u = c.length - 1), T(c[u]), j(), t = !0, void audio.play()) : !1;
        },
        repeat: function () {
            var t = ge("lm_audio");
            if(t) {
                if(repeat === true)
                    removeClass('repeat_enabled', 'lm_audio');
                else
                    addClass('repeat_enabled', 'lm_audio');
            }
            return audio.support ? (repeat = (repeat === true ? false : true) ) : !1;
        },
        playlist: function (e, t) {
            return audio.support ? "undefined" == typeof e ? c : (v && audio.pause(), B() && audio.onDeselect(!0), c = e, p = t && t.q || "", u = null, d = {}, each(e, function (e, t) {
                d[t.id] = e;
            }), A(p), void 0) : !1;
        },
        playlist_q: function () {
            return p;
        }
    };
}(), audioplayer = function () {
    var e = "1" == lsGet("audio_time_left"), o = null, i = 0, r = {}, restoreBasisContent, restoreHeadContent;
    audio.onPlay(l), audio.onPause(c), audio.onSelect(u), audio.onDeselect(d), audio.onProgress(function (e, t, a) {
        var n = ge("audio" + e);
        audio.playing() ? (addClass("ai_playing", n), addClass("ai_playing", "lm_audio")) : (removeClass("ai_playing", n), removeClass("ai_playing", "lm_audio")), n && (C(n, t / a), addClass("ai_current", n));
    }), audio.onPositionChanged(p), audio.onVolumeChanged(function (e, t) {
        var a = ge("audio" + e);
        a && x(a, t);
    }), audio.onEnded(function (e) {
        var t = ge("audio" + e);
        t && k(t, 1);
    }), audio.onNotFoundError(v), audio.onEmptyPlaylistError(v);
    function s() {
        each(geByClass("ai_current"), function (e, t) {
            t = S(t), d(t.id, t.dur);
        });
        var e = audio.getCurrentId(), t = ge("audio" + e), a = audio.loaded(), n = audio.position(),
            o = audio.duration();
        audio.playing() ? (addClass("ai_playing", t), addClass("ai_playing", "lm_audio")) : (removeClass("ai_playing", t), removeClass("ai_playing", "lm_audio")), u(audio.getCurrent()), C(t, a / o), p(audio.getCurrentId(), n, o);
    }

    function l(e) {
        addClass("ai_playing", "lm_audio");
        var t = ge("audio" + e);
        t && (addClass("ai_playing", t), addClass("ai_current", t), audioplayer.playback(e));
    }

    function c(e) {
        removeClass("ai_playing", "lm_audio");
        var t = ge("audio" + e);
        t && (removeClass("ai_playing", t), addClass("ai_current", t), audioplayer.playback(e, !0));
    }

    function u(e) {
        if (!e) {
            return void hide("lm_player");
        }
        show("lm_player");
        var t = ge("lm_audio");
        if(t) {
            if (e.title == "")
                hide(geByClass1("divider", t));
            else
                show(geByClass1("divider", t));

        }
        t && (val(geByClass1("ai_artist", t), e.artist), val(geByClass1("ai_title", t), e.title));
        var a = ge("audio" + e.id);
        a && (C(a, 0), k(a, 0), w(a, T(0, audio.duration())), x(a, audio.volume()), addClass("ai_current", a));
    }

    function d(e, t) {
        var a = ge("audio" + e);
        removeClass("ai_playing", "lm_audio"), a && (w(a, z(t)), removeClass("ai_playing", a), removeClass("ai_current", a), i = 0, r[e] && delete r[e]);
    }

    function p(e, t, a) {
        var n = ge("audio" + e);
        n && (f || k(n, t / a), x(n, audio.volume()), w(n, audioplayer.getFormatedTime(t, a)), t > 1 && (r[e] = 1));
    }

    function v(e) {
        //t = gpeByClass("audios_list", "audio" + e), a = geByClass("audio_item", t)
        var a = geByClass("audio_item"), n = [], o = !1;
        each(a, function (t, a) {
            return (a = S(a)) ? (n.push(a), void(a.id == e && (o = !0))) : !0;
        }), audio.playlist(n, {q: ""}), o && audio.play(e);
    }

    var f = null, g = null, h = !1, _ = !1;
    addEvent(document, isTouch ? "touchend touchcancel" : "mouseup", y), addEvent(document, isTouch ? "touchmove" : "mousemove", m);
    function m(e) {
        if (f) {
            var t = gpeByClass("audio", f), a = b(f, e);
            e && cancelEvent(e), h && k(t, a), _ && (x(t, a), audio.volume(a)), g = a;
        }
    }

    function y(e) {
        if (f) {
            var t = gpeByClass("audio_item", f), a = b(f, e) || g;
            e && cancelEvent(e), h && (k(t, a), audio.position(a, !0)), _ && x(t, a), f = g = null, h = _ = !1;
        }
    }

    function b(e, t) {
        var a = hasClass("touch", bodyNode) ? 10 : 8,
            n = t.pageX || t.touches && t.touches[0] && t.touches[0].pageX || 0, o = n - getX(e) - a / 2,
            i = e.offsetWidth - a, r = i ? Math.max(0, Math.min(o / i, 1)) : 0;
        return r;
    }
    var currentTrack = undefined;
    function w(e, t) {
        if (e) {
            var a = geByClass1("ai_dur", e);
            if(a) {
                val(a, t);
                if (currentTrack !== audio.getCurrentId() && audio.position() > 0.1) {
                    /**
                     * ToDo send request listen music
                     */
                    var title = audio.getCurrent().title;
                    var dur = parseInt(audio.duration().toFixed(0));
                    hide(ge('pp_status_link'));
                    var listenMusic = ge('listenMusic');
                    show(listenMusic);
                    val(geByClass1('ai_artist', listenMusic), title);
                    restoreBasisContent !== undefined && restoreBasisContent.find('.ai_artist').text(title);
                    $.post('/listen_music.php', {
                        title: title,
                        dur: dur
                    });
                    currentTrack = audio.getCurrentId();
                }
            }
        }
    }

    function C(e, t) {
        if (audio.isRadio()) {
            var a = geByClass1("aic_progress_wrap", e);
            if(a !== undefined) {
                var n = geByClass1("aic_load_line", a);
                n.style.width = 100 * Math.max(0, Math.min(t, 1)) + "%";
                if (parseInt(n.style.width) > 0)
                    removeClass("slider_loading_bar", geByClass1("slider_loading_bar", e));
            }
        }
    }

    function k(e, t) {
        if (e) {
            {
                var a = geByClass1("aic_progress_wrap", e), n = geByClass1("aic_progress_line", a);
                geByClass1("aic_slider", n);
            }
            n.style.width = 100 * t + "%";
        }
    }

    function x(e, t) {
        if (e) {
            {
                var a = geByClass1("aic_volume_wrap", e), n = geByClass1("aic_progress_line", a);
                geByClass1("aic_slider", n);
            }
            n.style.width = 100 * t + "%";
        }
    }

    function S(e) {
        if (e = ge(e), !e || !attr(e, "data-id")) {
            return !1;
        }
        var t = attr(e, "data-id"), a = val(geByTag1("input", e)), n = attr(geByClass1("ai_dur", e), "data-dur"),
            o = val(geByClass1("ai_artist", e)), i = val(geByClass1("ai_title", e)), c = attr(geByClass1("ai_play", e), "style");
        return {id: t, src: a, cover: c, dur: n, artist: htsc(stripTags(o)), title: htsc(stripTags(i))};
    }

    function B(e, t, a) {
        if (!e) {
            return "";
        }
        var n = htsc(e.id), o = htsc(e.src), i = +e.dur, r = e.artist, s = e.title, l = e.can_add, c = e.can_del,
            u = s ? '<span class="divider"> &ndash; </span>' : "", d = isTouch ? "ontouchstart" : "onmousedown", p = "",
            v = "";
    }

    function z(e) {
        var t, a, n, o = 0 > e;
        return e = Math.round(o ? -e : e), a = e % 60, t = 10 > a ? "0" + a : a, e = Math.floor(e / 60), n = e % 60, t = n + ":" + t, e = Math.floor(e / 60), e > 0 && (10 > n && (t = "0" + t), t = e + ":" + t), o && (t = "-" + t), t;
    }

    function T(t, a) {
        return z(e && a ? t - a : t);
    }

    return {
        init: function (e) {
            return audio.support ? void("") : !1;
        }, initAudio: s, isOpenPlayer: false, getDOMFromAudio: B, playPause: function (e, t, a) {
            if(e.target.className === "i_download" || e.target.className === "ai_download") {
                return false;
            }
            if (audio.support) {
                var n = ge("audio" + t);
                a && t != audio.getCurrentId() ? v(t, !0) : audio.operate(t);
            } else {
                alert('mobile_audio_player_not_support');
            }
            return cancelEvent(e), !1;
        }, getFormatedTime: T, switchTimeFormat: function (t, a) {
            var n = gpeByClass("audio_item", t);
            if (!hasClass("ai_current", n) || hasClass("ai_select", n)) {
                return !0;
            }
            e = !e, lsSet("audio_time_left", e ? "1" : "0");
            var o = ge("audio" + audio.getCurrentId());
            return w(o, T(audio.position(), audio.duration())), a && cancelEvent(a), !1;
        }, setPosition: function (e, t) {
            f || (f = e, h = !0, m(t));
        }, setVolume: function (e, t) {
            f || (f = e, _ = !0, m(t));
        }, playback: function (e, a) {
            if (clearTimeout(o), !a && e && e != i) {
                o = setTimeout(1E4);
            }
        }, openPlayer: function() {
            var p = audio.playlist();
            if(p.length <= 0 || audioplayer.isOpenPlayer === true) {
                return false;
            }
            audioplayer.isOpenPlayer = true;
            $('#vk_wrap').removeClass('lm_opened');
            $('body').removeClass('lm_opened');
            restoreBasisContent = $('#m #mcont').children();
            restoreHeadContent = $('#mhead h1.header__center').children();
            $('#mhead h1.header__center').html('<a class="header__back al_back" href="" accesskey="0" aria-label="Назад" onclick="return audioplayer.backContent()"></a>\n' +
                '<span class="header__title hb_btn mh_header mhi_back">Плейлист</span>\n');
            var tmpNode = '<div class="pcont audioPage">\n' +
            '<div id="au_search_items" class="upanel bl_cont">\n' +
            '<div class="audios_block audios_list _si_container">\n';
            for(var l in p) {
                tmpNode += '<div id="audio' + p[l].id + '" data-id="' + p[l].id + '" class="audio_item  ai_has_btn" onclick="audioplayer.playPause(event, \'' + p[l].id + '\')">\n' +
                    '        <div class="ai_info">\n' +
                    '            <div class="ai_play" style=""><i class="i_play"></i></div>\n' +
                    '            <div class="ai_body">\n' +
                    '                <div class="ai_dur" onclick="audioplayer.switchTimeFormat(this, event);"></div>\n' +
                    '                <div class="ai_label">\n' +
                    '                    <span class="ai_title">' + p[l].title + '</span>\n' +
                    '                    <span class="divider" style="display: none"></span>\n' +
                    '                    <span class="ai_artist" style="display: none"></span>\n' +
                    '                </div>\n' +
                    '                <input type="hidden" value="' + p[l].src + '">\n' +
                    '            </div>\n' +
                    '        </div>\n' +
                    '        <div class="ai_controls">\n' +
                    '            <table class="row_table">\n' +
                    '                <tbody><tr>\n' +
                    '                    <td class="aic_progress_wrap">\n' +
                    '                        <div class="aic_line" onmousedown="audioplayer.setPosition(this, event);" onclick="cancelEvent(event);">\n' +
                    '                            <div class="aic_ln aic_back_line" onclick="cancelEvent(event);"></div>\n' +
                    '                            <div class="aic_ln aic_load_line" onclick="cancelEvent(event);"></div>\n' +
                    '                            <div class="aic_ln aic_pl_wrap" onclick="cancelEvent(event);">\n' +
                    '                                <div class="aic_ln aic_progress_line" onclick="cancelEvent(event);">\n' +
                    '                                    <div class="aic_slider" onclick="cancelEvent(event);"></div>\n' +
                    '                                </div>\n' +
                    '                            </div>\n' +
                    '                        </div>\n' +
                    '                    </td>\n' +
                    '                    <td class="aic_volume_wrap">\n' +
                    '                        <div class="aic_line" onmousedown="audioplayer.setVolume(this, event);" onclick="cancelEvent(event);" style="display: block;">\n' +
                    '                            <div class="aic_ln aic_back_line" onclick="cancelEvent(event);"></div>\n' +
                    '                            <div class="aic_ln aic_pl_wrap" onclick="cancelEvent(event);">\n' +
                    '                                <div class="aic_ln aic_progress_line" onclick="cancelEvent(event);">\n' +
                    '                                    <div class="aic_slider" onclick="cancelEvent(event);"></div>\n' +
                    '                                </div>\n' +
                    '                            </div>\n' +
                    '                        </div>\n' +
                    '                    </td>\n' +
                    '                </tr>\n' +
                    '                </tbody></table>\n' +
                    '        </div>\n' +
                    '    </div>';
            }
            tmpNode += '</div>\n</div>\n</div>';
            $('#m #mcont').html(tmpNode);
        }, backContent: function() {
            if(restoreBasisContent === undefined && restoreHeadContent === undefined || restoreBasisContent.length <= 0 && restoreHeadContent.length <= 0) {
                return false;
            }
            audioplayer.isOpenPlayer = false;
            $('#m #mcont').html(restoreBasisContent);
            $('#mhead h1.header__center').html(restoreHeadContent);
            restoreHeadContent = restoreBasisContent = undefined;
            return false;
        }
    };
}();