var menuRightWidth = 262;

function press_and_hold(btn, action) {
    var t, i = 0, start = 750, step = 10, speedup = 1.3, speed = 100;
    
    var repeat = function () {
        action();
        t = setTimeout(repeat, (i == 0 ? start : speed));
        ++i;
        if(i % step == 0) {
            speed /= speedup;
        }
    }
    
    btn.mousedown(function() {
            i = 0;
            speed = 100;
            repeat();
    });
    
    btn.mouseup(function () {
            clearTimeout(t);
    });
};

function initPlayer(doc, mediaId, mediaType)
{
    if(!mediaType) {
        mediaType = 4;
    }
    
    doc.tsPlayer = tsplayer("tsplayer", {
            contextDocument: doc,
            autoPlay: true,
            playerId: mediaId,
            mediaType: mediaType,
            iframeCommunication: "direct",
            controls: {
                type: "external",
                style: "white"
            },
            vars: {
                menuVisible: false,
                playlistVisible: false,
                playlistCountItems: 0,
                playlistTotalPages: 0,
                playlistCurrentPage: 0,
                playlistPageHeight: 0,
                draggingProgress: false,
                dragStartPosition: 0,
                dragPosition: 0,
                embedWidth: 650,
                embedHeight: 521
            },
            onPlayerLoad: function() {
                var uid = this.get_player_id(),
                    playerEmbedUrl = 'http://torrentstream.org/play.php?id=' + uid,
                    playerEmbedTitle = "Torrent Stream Player";

                log("onPlayerLoad: uid=" + uid + " link=" + playerEmbedUrl);
                updateEmbedCode(doc, this);
                $("#torrentstream-body .player-embed-link", doc).val(playerEmbedUrl);

                $("#torrentstream-body .share-link-fb", doc).attr("href", "http://www.facebook.com/sharer.php?u=" + Url.encode(playerEmbedUrl) + "&t=" + Url.encode(playerEmbedTitle));
                $("#torrentstream-body .share-link-vk", doc).attr("href", "http://vkontakte.ru/share.php?url=" + Url.encode(playerEmbedUrl));
                $("#torrentstream-body .share-link-twitter", doc).attr("href", "http://twitter.com/share?url=" + Url.encode(playerEmbedUrl) + "&text=" + Url.encode(playerEmbedTitle));
                $("#torrentstream-body .share-link-buzz", doc).attr("href", "http://www.google.com/buzz/post?url=" + Url.encode(playerEmbedUrl));
                $("#torrentstream-body .share-link-odnoklassniki", doc).attr("href", "http://www.odnoklassniki.ru/dk?st.cmd=addShare&st._surl=" + Url.encode(playerEmbedUrl));
                $("#torrentstream-body .share-link-myspace", doc).attr("href", "http://www.myspace.com/index.cfm?fuseaction=postto&t=" + Url.encode(playerEmbedTitle) + "&u=" + Url.encode(playerEmbedUrl));
                $("#torrentstream-body .share-link-lj", doc).attr("href", "http://www.livejournal.com/update.bml?event=" + Url.encode(playerEmbedUrl) + "&subject=" + Url.encode(playerEmbedTitle));
            },
            onLoad: function() {
                var videoOptions = this.getVideoOptions(),
                    videoSettings = this.getVideoSettings(),
                    audioOptions = this.getAudioOptions(),
                    audioSettings = this.getAudioSettings();
                setMenuOptions("video-aspect-ratio", videoOptions.aspect_ratio, doc);
                setMenuOptions("video-crop", videoOptions.crop, doc);
                setMenuOptions("audio-channel", audioOptions.channel, doc);

                setSubtitle(-2, doc);
                setAudioTrack(-2, doc);
                setAudioChannel(audioSettings.channel, doc, audioOptions.channel);
                setAspectRatio(videoSettings.aspect_ratio, doc, videoOptions.aspect_ratio);
                setCrop(videoSettings.crop, doc, videoOptions.crop);
            },
            onStart: function(index) {
                var videoOptions = this.getVideoOptions(),
                    audioOptions = this.getAudioOptions();

                log("onStart: audioOptions.track=" + audioOptions.track);
                setMenuOptions("video-subtitle", videoOptions.subtitle, doc);
                setMenuOptions("audio-track", audioOptions.track, doc);

                setSubtitle(this.subtitle(), doc);
                setAudioTrack(this.audioTrack(), doc);

                $("#torrentstream-body .player-controls .button-play", doc).data("state", "play").css("background-position", "-99px 0px");
            },
            onPrebuffering: function(index) {
                $("#torrentstream-body .playlist-item[fileindex!=" + index + "] .playlist-play", doc).css("background-position", "-224px -229px");
                $("#torrentstream-body .playlist-item[fileindex=" + index + "] .playlist-play", doc).css("background-position", "-241px -229px");
                $("#torrentstream-body .player-controls .button-power", doc).css({'background-position': '-490px -34px'});
            },
            onPlay: function(index) {
                $("#torrentstream-body .player-controls .button-play", doc).data("state", "play").css("background-position", "-99px 0px");
                $("#torrentstream-body .playlist-item[fileindex=" + index + "] .playlist-play", doc).css("background-position", "-241px -229px");
            },
            onPause: function(index) {
                $("#torrentstream-body .player-controls .button-play", doc).data("state", "pause").css("background-position", "0px 0px");
                $("#torrentstream-body .playlist-item[fileindex=" + index + "] .playlist-play", doc).css("background-position", "-224px -229px");
                $("#torrentstream-body .player-controls .button-power").css({'background-position': '-507px -34px'});
            },
            onStop: function(index) {
                $("#torrentstream-body .player-controls .button-play", doc).data("state", "stop").css("background-position", "0px 0px");
                $("#torrentstream-body .playlist-item[fileindex=" + index + "] .playlist-play", doc).css("background-position", "-224px -229px");
                $('#torrentstream-body .player-duration', doc).hide();
            },
            onFullStop: function(index) {
                $("#torrentstream-body .player-controls .button-play", doc).data("state", "stop").css("background-position", "0px 0px");
                $("#torrentstream-body .playlist-item[fileindex=" + index + "] .playlist-play", doc).css("background-position", "-224px -229px");
                $("#torrentstream-body .player-controls .button-power", doc).css({'background-position': '-507px -34px'});
                $('#torrentstream-body .player-duration', doc).hide();
            },
            onMessage: function(message) {
                startScroll(doc, message);
            },
            onUpdateDuration: function(duration) {
                var offset = "";
                for (var i=0; i<8; i++) {
                    if (i==2 || i==5) {
                        $('#torrentstream-body .player-duration-number'+(i+1), doc).css("background", "no-repeat url(http://torrentstream.org/extension/img/numbers-white.png) -111px 0");
                        continue;
                    }
                    switch (duration[i]) {
                        case "0": offset = "0px 0"; break;
                        case "1": offset = "-11px 0"; break;
                        case "2": offset = "-22px 0"; break;
                        case "3": offset = "-33px 0"; break;
                        case "4": offset = "-44px 0"; break;
                        case "5": offset = "-55px 0"; break;
                        case "6": offset = "-66px 0"; break;
                        case "7": offset = "-78px 0"; break;
                        case "8": offset = "-89px 0"; break;
                        case "9": offset = "-100px 0"; break;
                        case ":": offset = "-111px 0"; break;
                        case "-": offset = "-118px 0"; break;
                    }
                    $('#torrentstream-body .player-duration-number'+(i+1), doc).css("background", "no-repeat url(http://torrentstream.org/extension/img/numbers-white.png) "+offset);
                }
                $('#torrentstream-body .player-duration', doc).show();
            },
            onUpdatePosition: function(pos) {
                if( ! this.getVar("draggingProgress")) {
                    setPosition(doc, pos);
                }
            },
            onMute: function(muted) {
                if(muted) {
                    $("#torrentstream-body .player-controls .button-sound", doc).css({'background-position': '-473px -33px'}).attr('title', titleUnMute);
                }
                else {
                    $("#torrentstream-body .player-controls .button-sound", doc).css({'background-position': '-456px -34px'}).attr('title', titleMute);
                }
            },
            onPlaylist: function(files) {
                var tsPlayer = this;
                tsPlayer.setVar("playlistCountItems", files.length);

                $("#torrentstream-body .playlist-box", doc).removeData("jsp");
                $("#torrentstream-body .playlist-box", doc).html("");

                var rowClass = "";
                for(var i = 0; i < files.length; i++) {
                    rowClass = (i % 2 == 0) ? "n1" : "n2";
                    if(i == (files.length - 1)) {
                        rowClass += " last";
                    }
                    $("#torrentstream-body .playlist-box", doc).append(
                        '<div class="playlist-item checked ' + rowClass + '" fileindex="' + i + '" rel="' + files[i].id + '">'+
                            '<div class="playlist-col-check">'+
                                '<div class="playlist-check"></div>'+
                            '</div>'+
                            '<div class="playlist-col-name">'+
                                '<div class="text-scroll-container">'+
                                    '<span class="text-scroll-inner">' + files[i].file + '</span>'+
                                '</div>'+
                            '</div>'+
                            '<div class="playlist-col-actions">'+
                                '<div class="playlist-play"></div>'+
                            '</div>'+
                        '</div>'
                        );
                }

                // playlist checkbox
                $("#torrentstream-body .playlist-check", doc).click(
                    function() {
                        var $item = $(this).parent().parent();
                        if($item.hasClass("checked")) {
                            $item.removeClass("checked");
                            $item.find(".playlist-play").hide();
                        }
                        else {
                            $item.addClass("checked");
                            $item.find(".playlist-play").show();
                        }
                        playlistUpdate(doc);
                    });

                // play/pause from playlist
                $("#torrentstream-body .playlist-play", doc).click(
                    function() {
                        if($(this).parent().parent().hasClass("checked")) {
                            var item_pos = $(this).parent().parent().attr("fileindex");
                            tsPlayer.play(item_pos);
                        }
                    });

                // init scroller
                log(">>> onPlaylist: init jScrollPane");
                $("#torrentstream-body .playlist-box", doc).jScrollPane({
                        verticalGutter: 0
                })
                .bind('jsp-scroll-y', function(event, scrollPositionY, isAtTop, isAtBottom) {
                        if(tsPlayer.getVar("playlistTotalPages") < 2) {
                            return;
                        }

                        var playlistPageHeight = tsPlayer.getVar("playlistPageHeight");
                        var from = Math.round(scrollPositionY / 32),
                            to = Math.round((scrollPositionY + playlistPageHeight) / 32);
                        $("#torrentstream-body .playlist-pages-info", doc).html(results + " " + (from+1) + " - " + to + " " + outOf + " " + tsPlayer.getVar("playlistCountItems"));

                        if(isAtTop) {
                            playlistSetPage(0, doc);
                            return;
                        }

                        if(isAtBottom) {
                            playlistSetPage(tsPlayer.getVar("playlistTotalPages") - 1, doc);
                            return;
                        }

                        if(playlistPageHeight > 0) {
                            var page = scrollPositionY / playlistPageHeight;
                            page = Math.round(page);
                            if(page != tsPlayer.getVar("playlistCurrentPage")) {
                                playlistSetPage(page, doc);
                                changeCurrentPlaylistPage(page, doc);
                            }
                        }
                });

                log(">>> onPlaylist: init sortable");
                $("#torrentstream-body .playlist-box .jspPane", doc).sortable({
                        contextDocument: doc,
                        update: function() {
                            playlistUpdate(doc);
                            $('#torrentstream-body .playlist-box .playlist-item', doc).each(function (z) {
                                $(this).removeClass("n1 n2");
                                rowClass = (z % 2 == 0) ? "n1" : "n2";
                                $(this).addClass(rowClass);
                            });
                        }
                });

                initPlaylistPages(doc, this);

                $("#torrentstream-body .playlist-col-name", doc)
                .scrollText({
                        marginLeft: 0,
                        marginRight: 16
                })
                .hover(
                    function() {
                        $(this).scrollText("start");
                    },
                    function() {
                        $(this).scrollText("stop");
                    }
                    );

                lineHeight = tsPlayer.getVar("playlistCountItems") * 32;
                $("#torrentstream-body .playlist-box", doc).before(
                    '<div class="border-line left-line" style="height: ' + lineHeight + 'px;"></div>'+
                    '<div class="border-line right-line" style="height: ' + lineHeight + 'px;"></div>'
                );

                var boxHeight = $("#torrentstream-body .playlist-box", doc).height();
                if (tsPlayer.getVar("playlistCountItems") * 32 <= boxHeight) {
                    $("#torrentstream-body .bottom-yellow", doc).hide();
                }
                else{
                    $("#torrentstream-body .bottom-yellow", doc).show();
                }
            }
    });
	
	return doc.tsPlayer;
}

function playerDestroy(doc) {
    playerActive = false;
    if(doc.tsPlayer) {
        try {
            showPlaylist(false, doc);
            showMenu(false, doc);
            doc.tsPlayer.destroy();
            doc.tsPlayer = null;
        }
        catch(e) {
        }
    }
    
    $("#tsplayer").css({
        width: "1px",
        height: "1px"
    });
    
    $("#player-got-plugin").show();
}

function handleClick(control, doc)
{
    var tsPlayer = doc.tsPlayer;
    
    if(!playerActive) {
        if(control == "play") {
            showPlayer(doc, playerId);
        }
        return;
    }
    
    if(control == "fullstop") {
        try {
            tsPlayer.fullstop();
        }
        catch(e) {
        }
        hidePlayer(doc);
    }
    
    if(tsPlayer.isBlocked()) {
        return;
    }
    if(control == "play") {
        tsPlayer.play();
    }
    else if(control == "stop") {
        tsPlayer.stop();
    }
    else if(control == "prev") {
        tsPlayer.prev();
    }
    else if(control == "next") {
        tsPlayer.next();
    }
    else if(control == "vol-down") {
        tsPlayer.volume(-1);
    }
    else if(control == "vol-up") {
        tsPlayer.volume(1);
    }
    else if(control == "mute") {
        tsPlayer.toggleMute();
    }
    else if(control == "fullscreen") {
        tsPlayer.toggleFullscreen();
    }
    else if(control == "menu") {
        showMenu(!tsPlayer.getVar("menuVisible"), doc);
    }
    else if(control == "playlist") {
        showPlaylist(!tsPlayer.getVar("playlistVisible"), doc);
    }
}

function setMenuOptions(param, options, doc)
{
    log("++++ setMenuOptions: param=" + param + " options=" + options);
    $("#torrentstream-body .menu-options-" + param, doc).html("");
    if(options.length == 0) {
        $("#torrentstream-body .menu-dd-open[rel=\"" + param + "\"]", doc).hide();
        return;
    }
    $("#torrentstream-body .menu-dd-open[rel=" + param + "]", doc).show();
    for(var i = 0; i < options.length; i++) {
        $("#torrentstream-body .menu-options-" + param, doc).append('<li value="' + i + '">' + options[i] + '</li><br/>');
    }
    $("#torrentstream-body .menu-options-" + param + " li", doc).click(function() {
            var tsPlayer = doc.tsPlayer,
                param = $(this).parent().attr("rel"),
                value = $(this).attr("value");
                
            log("++++ setMenuOptions: click: param=" + param + " value=" + value);

            if(param == "video-subtitle") {
                tsPlayer.subtitle(value);
                setSubtitle(value, doc);
            }
            else if(param == "video-aspect-ratio") {
                tsPlayer.aspectRatio(value);
                setAspectRatio(value, doc);
            }
            else if(param == "video-crop") {
                tsPlayer.crop(value);
                setCrop(value, doc);
            }
            else if(param == "audio-track") {
                log("++++ setMenuOptions: click: set_audioTrack: " + value);
                tsPlayer.audioTrack(value);
                setAudioTrack(value, doc);
            }
            else if(param == "audio-channel") {
                tsPlayer.audioChannel(value);
                setAudioChannel(value, doc);
            }
            // close popup
            $(this).parent().parent().parent().hide();
    }).hover(
    function() {
        $(this).css({'text-decoration': 'underline'});
    },
    function() {
        $(this).css({'text-decoration': 'none'});
    }
    );
}

function setAudioTrack(val, doc, options)
{
    if(val === -2) {
        val = 'Video not loaded';
    }
    else if(val === -1) {
        val = 'Not available';
    }
    else if(val === 0) {
        val = 'Off';
    }
    else {
        try {
            if(options === undefined) {
                options = doc.tsPlayer.getAudioOptions("track");
            }
            val = options[val];
        }
        catch(e) {
            val = null;
        }
        if(!val) {
            val = "?";
        }
    }
    $("#torrentstream-body .menu-audio-track-value", doc).text(val);
}

function setAudioChannel(idx, doc, options)
{
    var val = "";
    try {
        if(options === undefined) {
            options = doc.tsPlayer.getAudioOptions("channel");
        }
        val = options[idx];
    }
    catch(e) {
    }
    if(val.length == 0) {
        val = "?";
    }
    $("#torrentstream-body .menu-audio-channel-value", doc).text(val);
}

function setSubtitle(val, doc, options)
{
    if(val === -2) {
        val = 'Video not loaded';
    }
    else if(val === -1) {
        val = 'Not available';
    }
    else if(val === 0) {
        val = 'Off';
    }
    else {
        try {
            if(options === undefined) {
                options = doc.tsPlayer.getVideoOptions("subtitle");
            }
            val = options[val];
        }
        catch(e) {
            val = null;
        }
        if(!val) {
            val = "?";
        }
    }
    $("#torrentstream-body .menu-video-subtitle-value", doc).text(val);
}

function setAspectRatio(idx, doc, options)
{
    var val = "";
    try {
        if(options === undefined) {
            options = doc.tsPlayer.getVideoOptions("aspect_ratio");
        }
        val = options[idx];
    }
    catch(e) {}
    if(!val) {
        val = 'Default';
    }
    $("#torrentstream-body .menu-video-aspect-ratio-value", doc).text(val);
}

function setCrop(idx, doc, options)
{
    var val = "";
    try {
        if(options === undefined) {
            options = doc.tsPlayer.getVideoOptions("crop");
        }
        val = options[idx];
    }
    catch(e) {}
    if(val.length == 0) {
        val = 'Default';
    }
    $("#torrentstream-body .menu-video-crop-value", doc).text(val);
}

function updateEmbedCode(doc, player)
{
    if( ! player) {
        player = doc.tsPlayer;
    }

    var embedCodeTpl = "<script type=\"text/javascript\">"+
    "var tsHost = ((\"https:\" == document.location.protocol) ? \"https://\" : \"http://\");"+
    "document.write(unescape(\"%3Cscript src='\" + tsHost + \"torrentstream.net/p/" + player.get_player_id() + "' type='text/javascript'%3E%3C/script%3E\"));"+
    "</script>\n"+
    "<script type=\"text/javascript\">"+
    "{init}"+
    "</script>";

    var embedCode = embedCodeTpl.replace("{init}", 'tsplayer(null, {width: "' + player.getVar("embedWidth") + 'px", height: "' + player.getVar("embedHeight") + 'px"});');
    $("#torrentstream-body .player-embed-code", doc).val(embedCode);
}

function startScroll(doc, message) {
    $("#torrentstream-body .player-status-message-inner", doc).text(message);
    $("#torrentstream-body .player-status-message-inner", doc).css("left", "0px");
    $("#torrentstream-body .player-status-message-inner-more", doc).hide();
    startingScroll = true;
    scrollText(doc);
}

var scrollingWidth = 0;
var needToShowScroller = false;
function scrollText(doc) {
    if (timerScrolling)
        clearTimeout(timerScrolling);
    $("#torrentstream-body .player-status-message-inner", doc).css("position", "absolute");
    $("#torrentstream-body .player-status-message-inner-more", doc).css("position", "absolute");

    var text = $("#torrentstream-body .player-status-message-inner", doc).text();
    scrollingWidth = $("#torrentstream-body .player-status-message-inner", doc).width();
    var parentWidth = $("#torrentstream-body .player-status-message", doc).width();
    if (scrollingWidth > parentWidth) {
        $("#torrentstream-body .player-status-message-inner-more", doc).show();
        $("#torrentstream-body .player-status-message-inner-more", doc).text(text);
        $("#torrentstream-body .player-status-message-inner-more", doc).css("left", (scrollingWidth + 20) + "px");
        needToShowScroller = true;
        scrollingText(doc);
    }
    else
        needToShowScroller = false;
}
var timerScrolling = false;
var timerForScrollDelay = false;
function scrollingText(doc) {
    timerScrolling = setTimeout(function() {
        var v1 = parseInt($("#torrentstream-body .player-status-message-inner", doc).css("left")) - 2;
        if (v1 < -parseInt($("#torrentstream-body .player-status-message-inner", doc).width()))
            v1 = parseInt($("#torrentstream-body .player-status-message-inner-more", doc).width()) + 40;
        $("#torrentstream-body .player-status-message-inner", doc).css("left", v1);
        var v2 = parseInt($("#torrentstream-body .player-status-message-inner-more", doc).css("left")) - 2;
        if (v2 < -parseInt($("#torrentstream-body .player-status-message-inner-more", doc).width()))
            v2 = parseInt($("#torrentstream-body .player-status-message-inner", doc).width()) + 40;
        $("#torrentstream-body .player-status-message-inner-more", doc).css("left", v2);
        scrollingText(doc);
    }, 50);
}

function setPosition(doc, pos, skipPlaceholder) {
    $("#torrentstream-body .player-controls .progress-bar", doc).css({width: (pos * 100) + "%"});
    if(!skipPlaceholder) {
        $("#torrentstream-body .player-controls .progress-placeholder", doc).css({left: (pos * 100) + "%"});
    }
}

function showMenu(visible, doc, skipHideContent) {
    log("[showMenu]");
    doc.tsPlayer.setVar("menuVisible", visible);
    if(visible) {
        if(doc.tsPlayer.getVar("playlistVisible")) {
            showPlaylist(false, doc, true);
        }
        else {
            $("#tsplayer", doc).css({width: "208px", height: "112px", left: "auto", right: ((menuRightWidth - 208) / 2) + "px", top: "105px"});
            doc.tsPlayer.onresize();
        }
        $("#torrentstream-body .menu-box", doc).show();
    }
    else {
        $("#torrentstream-body .menu-box", doc).hide();
        if( ! skipHideContent) {
            $("#tsplayer", doc).css({width: "100%", height: "100%", left: "0px", right: "auto", top: "0px"});
            doc.tsPlayer.onresize();
        }
    }
}
function showPlaylist(visible, doc, skipHideContent) {
    log("[showPlaylist]");
    doc.tsPlayer.setVar("playlistVisible", visible);
    if(visible) {
        if(doc.tsPlayer.getVar("menuVisible")) {
            showMenu(false, doc, true);
        }
        else {
            $("#tsplayer", doc).css({width: "208px", height: "112px", left: "auto", right: ((menuRightWidth - 208) / 2) + "px", top: "105px"});
            doc.tsPlayer.onresize();
        }
        $("#torrentstream-body .playlist-container", doc).show();
    }
    else {
        $("#torrentstream-body .playlist-container", doc).hide();
        if( ! skipHideContent) {
            $("#tsplayer", doc).css({width: "100%", height: "100%", left: "0px", right: "auto", top: "0px"});
            doc.tsPlayer.onresize();
        }
    }
    $("#torrentstream-body .playlist-box", doc).data("jsp").reinitialise();
    $("#torrentstream-body .playlist-col-name", doc).scrollText({
            marginLeft: 0,
            marginRight: 16
    });
    initPlaylistPages(doc);
}

function initPlaylistPages(doc, tsPlayer)
{
    if(tsPlayer === undefined) {
        tsPlayer = doc.tsPlayer;
    }
    log("[initPlaylistPages]");
    if( ! tsPlayer) {
        log("initPlaylistPages: no tsPlayer");
        return;
    }
    // item height = 32px
    var boxHeight = $("#torrentstream-body .playlist-box", doc).height();
    if(boxHeight == 0) {
        log("initPlaylistPages: null boxHeight, exit");
        return;
    }
    log("initPlaylistPages: playlistCountItems=" + tsPlayer.getVar("playlistCountItems"));
    var totalPages = Math.ceil(tsPlayer.getVar("playlistCountItems") * 32 / boxHeight),
        perPage = boxHeight / 32;
    log("initPlaylistPages: totalPages=" + totalPages + " boxHeight=" + boxHeight + " perPage=" + perPage);
    log("initPlaylistPages: playlistTotalPages=" + tsPlayer.getVar("playlistTotalPages"));
    if(totalPages != tsPlayer.getVar("playlistTotalPages")) {
        // reinit pages
        var playlistCurrentPage = 0,
            playlistTotalPages = totalPages,
            playlistPageHeight = boxHeight;
        tsPlayer.setVars({
            playlistCurrentPage: playlistCurrentPage,
            playlistTotalPages: playlistTotalPages,
            playlistPageHeight: playlistPageHeight
        });
        var from = Math.round(playlistCurrentPage * perPage),
            to = Math.round(from + perPage);
        $("#torrentstream-body .playlist-pages-info", doc).html(results + " " + (from+1) + " - " + to + " " + outOf + " " + tsPlayer.getVar("playlistCountItems"));
        // pages
        $("#torrentstream-body .playlist-pages", doc).html("");
        if(playlistTotalPages > 1) {
            var bgpos = "", currentClass = ""; styleClass = "";

            for(var i = 0; i < playlistTotalPages; i++) {
                if(i == playlistCurrentPage) {
                    currentClass = ' class="current"';
                }
                else {
                    currentClass = "";
                }
                if(i>playlistCurrentPage - 5 && i<playlistCurrentPage + 5)
                    styleClass = 'style="display:inline"';
                else
                    styleClass = 'style="display:none"';
                var $page = $('<li class="li-'+i+' bug-li" '+styleClass+'><a href="#"' + currentClass + ' rel="' + i + '"><b>' + (i+1) + '</b></a></li>', doc);

                $page.find("a").click(function(e) {
                        e.preventDefault();
                        var newpage = $(this).attr("rel");
                        var jspApi = $("#torrentstream-body .playlist-box", doc).data("jsp");
                        jspApi.scrollToY(playlistPageHeight * newpage, true);
                        changeCurrentPlaylistPage(newpage, doc);
                });
                $("#torrentstream-body .playlist-pages", doc).append($page);
            }
            $(".playlist-pages-container", doc).show();
            $(".bottom-yellow", doc).show();
        }
        else {
            $(".playlist-pages-container", doc).hide();
            $(".bottom-yellow", doc).hide();
        }
    }
}

function changeCurrentPlaylistPage(newIndex, doc) {
    $('.bug-li', doc).css("display", "none");
    log("$('.bug-li', doc).size()="+$('.bug-li', doc).size());
    leftC = parseInt(newIndex) - 2;
    if (parseInt(newIndex) == doc.tsPlayer.getVar("playlistTotalPages") - 1)
        leftC -= 2;
    if (parseInt(newIndex) == doc.tsPlayer.getVar("playlistTotalPages") - 2)
        leftC -= 1;
        log("leftC="+leftC);
    rightC = parseInt(newIndex) + 2;
    if (parseInt(newIndex) == 0)
        rightC += 2;
    if (parseInt(newIndex) == 1)
        rightC += 1;
        log("rightC="+rightC);
    for (j=leftC; j<=rightC; j++) {
        $('.li-'+j, doc).css("display", "inline");
    }
}

function playlistSetPage(page, doc)
{
    log("[playlistSetPage]");
    $("#torrentstream-body .playlist-pages a[rel=" + doc.tsPlayer.getVar("playlistCurrentPage") + "]", doc).removeClass("current");
    $("#torrentstream-body .playlist-pages a[rel=" + page + "]", doc).addClass("current");
    doc.tsPlayer.setVar("playlistCurrentPage", page);
}

function playlistUpdate(doc)
{
    var tsPlayer = doc.tsPlayer;
    log("[playlistUpdate]");
    tsPlayer.playlist_clear();
    $("#torrentstream-body .playlist-item", doc).filter(".checked").each(
        function(index) {
            $(this).attr("fileindex", index);
            tsPlayer.playlist_add($(this).attr("rel"));
        });
    var a = [], p = tsPlayer.playlist_get();
    for(var i = 0; i < p.length; i++) {
        a.push(p[i].id + ": " + p[i].name);
    }
    $("#torrentstream-body .playlist-box .jspPane .playlist-item", doc).removeClass("last");
    $("#torrentstream-body .playlist-box .jspPane .playlist-item:last", doc).addClass("last")
}

function showMenuPage(page, doc)
{
    log("[showMenuPage]");
    var bpActive = "", bpNotActive = "";
    var backgroundPositions = {
        home: {
            active: "-36px -260px",
            notActive: "0px -259px"
        },
        video: {
            active: "-108px -260px",
            notActive: "-72px -259px"
        },
        audio: {
            active: "-180px -260px",
            notActive: "-144px -259px"
        },
        social: {
            active: "-252px -260px",
            notActive: "-216px -259px"
        },
        info: {
            active: "-324px -260px",
            notActive: "-288px -260px"
        }
    };
    $("#torrentstream-body .menu-page", doc).not("#torrentstream-body .menu-page-" + page).hide();
    $("#torrentstream-body .menu-page-" + page, doc).show();
    $("#torrentstream-body .menu-icon.active", doc).each(
        function() {
            $(this).removeClass("active").css("background-position", backgroundPositions[$(this).attr("rel")].notActive);
        });
    $("#torrentstream-body .menu-icon[rel=" + page + "]", doc).addClass("active").css("background-position", backgroundPositions[page].active);
}

function attachControlsEvents(doc)
{
    $("#torrentstream-body .player-status-message", doc).mousemove(function(e) {
            if (timerScrolling)
                clearTimeout(timerScrolling);
            var message = $("#torrentstream-body .player-status-message-inner", doc).text();
            if (timerForScrollDelay)
                clearTimeout(timerForScrollDelay);
            if (needToShowScroller)
                timerForScrollDelay = setTimeout(function() { scrollingText(doc); }, 2000);
    });

    // player controls clicks
    $("#torrentstream-body .player-controls .control", doc).click(function() {
            handleClick($(this).attr("rel"), doc);
    });

    // player controls hover/press
    $("#torrentstream-body .player-controls .button-menu", doc).hover(
        function() { $(this).css({'background-position': '-543px 0px'}); },
        function() { $(this).css({'background-position': '-516px 0px'}); }
        );
    $("#torrentstream-body .player-controls .button-menu", doc).mousedown(function(){ $(this).css({'background-position': '-569px 0px'}); });
    $("#torrentstream-body .player-controls .button-menu", doc).mouseup(function(){ $(this).css({'background-position': '-543px 0px'}); });


    $("#torrentstream-body .player-controls .button-stop", doc).hover(
        function() { $(this).css({'background-position': '-346px 0px'}); },
        function() { $(this).css({'background-position': '-319px 0px'}); }
        );
    $("#torrentstream-body .player-controls .button-stop", doc).mousedown(function(){ $(this).css({'background-position': '-373px 0px'}); });
    $("#torrentstream-body .player-controls .button-stop", doc).mouseup(function(){ $(this).css({'background-position': '-346px 0px'}); });


    $("#torrentstream-body .player-controls .button-previous", doc).hover(
        function() { $(this).css({'background-position': '-48px -34px'}); },
        function() { $(this).css({'background-position': '0px -34px'}); }
        );
    $("#torrentstream-body .player-controls .button-previous", doc).mousedown(function(){ $(this).css({'background-position': '-96px -34px'}); });
    $("#torrentstream-body .player-controls .button-previous", doc).mouseup(function(){ $(this).css({'background-position': '-48px -34px'}); });


    $("#torrentstream-body .player-controls .button-play", doc).hover(
        function() {
            if($(this).data('state') == 'play') {
                $(this).css({'background-position': '-132px 0px'});
            }
            else {
                $(this).css({'background-position': '-33px 0px'});
            }
        },
        function() {
            if($(this).data('state') == 'play') {
                $(this).css({'background-position': '-99px 0px'});
            }
            else {
                $(this).css({'background-position': '0px 0px'});
            }
        }
        );
    $("#torrentstream-body .player-controls .button-play", doc).mousedown(function(){
            if($(this).data('state') == 'play') {
                $(this).css({'background-position': '-165px 0px'});
            }
            else {
                $(this).css({'background-position': '-66px 0px'});
            }
    });
    $("#torrentstream-body .player-controls .button-play", doc).mouseup(function(){
            if($(this).data('state') == 'play') {
                $(this).css({'background-position': '-99px 0px'});
            }
            else {
                $(this).css({'background-position': '-33px 0px'});
            }
    });

    $("#torrentstream-body .player-controls .button-next", doc).hover(
        function() { $(this).css({'background-position': '-192px -34px'}); },
        function() { $(this).css({'background-position': '-144px -34px'}); }
        );
    $("#torrentstream-body .player-controls .button-next", doc).mousedown(function(){ $(this).css({'background-position': '-240px -34px'}); });
    $("#torrentstream-body .player-controls .button-next", doc).mouseup(function(){ $(this).css({'background-position': '-192px -34px'}); });

    $("#torrentstream-body .player-controls .button-vol-down", doc).hover(
        function() { $(this).css({'background-position': '-358px -34px'}); },
        function() { $(this).css({'background-position': '-339px -34px'}); }
        );
    $("#torrentstream-body .player-controls .button-vol-down", doc).mousedown(function(){ $(this).css({'background-position': '-377px -34px'}); });
    $("#torrentstream-body .player-controls .button-vol-down", doc).mouseup(function(){ $(this).css({'background-position': '-358px -34px'}); });
    
    press_and_hold($("#torrentstream-body .player-controls .button-vol-down", doc), function() {
        if(doc.tsPlayer) {
            doc.tsPlayer.volume(-1);
        }
    });
    press_and_hold($("#torrentstream-body .player-controls .button-vol-up", doc), function() {
        if(doc.tsPlayer) {
            doc.tsPlayer.volume(1);
        }
    });

    $("#torrentstream-body .player-controls .button-vol-up", doc).hover(
        function() { $(this).css({'background-position': '-416px -34px'}); },
        function() { $(this).css({'background-position': '-396px -34px'}); }
        );
    $("#torrentstream-body .player-controls .button-vol-up", doc).mousedown(function(){ $(this).css({'background-position': '-436px -34px'}); });
    $("#torrentstream-body .player-controls .button-vol-up", doc).mouseup(function(){ $(this).css({'background-position': '-416px -34px'}); });

    $("#torrentstream-body .player-controls .button-playlist", doc).hover(
        function() { $(this).css({'background-position': '-429px 0px'}); },
        function() { $(this).css({'background-position': '-400px 0px'}); }
        );
    $("#torrentstream-body .player-controls .button-playlist", doc).mousedown(function(){ $(this).css({'background-position': '-458px 0px'}); });
    $("#torrentstream-body .player-controls .button-playlist", doc).mouseup(function(){ $(this).css({'background-position': '-429px 0px'}); });

    $("#torrentstream-body .player-controls .button-fullscreen", doc).hover(
        function() { $(this).css({'background-position': '-312px -34px'}); },
        function() { $(this).css({'background-position': '-288px -34px'}); }
        );

    // menu options change
    $("#torrentstream-body .menu-switch-down", doc).click(function() {
            var tsPlayer = doc.tsPlayer;
            var param = $(this).attr("rel");
            if(param == "video-subtitle") {
                setSubtitle(tsPlayer.subtitle("prev"), doc);
            }
            else if(param == "video-aspect-ratio") {
                setAspectRatio(tsPlayer.aspectRatio("prev"), doc);
            }
            else if(param == "video-crop") {
                setCrop(tsPlayer.crop("prev"), doc);
            }
            else if(param == "audio-track") {
                setAudioTrack(tsPlayer.audioTrack("prev"), doc);
            }
            else if(param == "audio-channel") {
                setAudioChannel(tsPlayer.audioChannel("prev"), doc);
            }
    });

    $("#torrentstream-body .menu-switch-up", doc).click(function() {
            var tsPlayer = doc.tsPlayer,
            param = $(this).attr("rel");
            if(param == "video-subtitle") {
                setSubtitle(tsPlayer.subtitle("next"), doc);
            }
            else if(param == "video-aspect-ratio") {
                setAspectRatio(tsPlayer.aspectRatio("next"), doc);
            }
            else if(param == "video-crop") {
                setCrop(tsPlayer.crop("next"), doc);
            }
            else if(param == "audio-track") {
                setAudioTrack(tsPlayer.audioTrack("next"), doc);
            }
            else if(param == "audio-channel") {
                setAudioChannel(tsPlayer.audioChannel("next"), doc);
            }
    });

    // menu popup window
    $("#torrentstream-body .menu-dd-open", doc).click(function() {
            var param = $(this).attr("rel");
            $("#torrentstream-body .menu-popup-" + param, doc).show();

            var maxw = 0;
            $("#torrentstream-body .menu-popup-" + param + " li", doc).each(function() {
                    if($(this).width() > maxw) {
                        maxw = $(this).width();
                    }
            });
            if(maxw > 0) {
                $("#torrentstream-body .menu-popup-" + param + " ul").css({"width": maxw});
            }
    });
	
	$("#torrentstream-body .show-popup-embed", doc).click(function() {
		$("#torrentstream-body .menu-popup-embed-code", doc).show();
	});
	
    $("#torrentstream-body .menu-popup-close", doc).click(function() {
            $(this).parent().parent().hide();
    });

    // menu-icons
    $("#torrentstream-body .menu-switch", doc).click(function() {
            showMenuPage($(this).attr("rel"), doc);
    });

    // menu embed code
    $("#torrentstream-body .player-embed-size", doc).click(function() {
            var tsPlayer = doc.tsPlayer;
            tsPlayer.setVar("embedWidth", $(this).attr("embed-width"));
            tsPlayer.setVar("embedHeight", $(this).attr("embed-height"));

            $("#torrentstream-body .player-embed-size", doc).removeClass("current");
            $(this).addClass("current");

            updateEmbedCode(doc, tsPlayer);
            return false;
    });

    //playlist head
    $("#torrentstream-body .td4", doc).html("<span> </span>");

    // playlist prev/next
    $("#torrentstream-body .playlist-prev-page", doc).click(function(e) {
            e.preventDefault();

            var curr = doc.tsPlayer.getVar("playlistCurrentPage"),
            newpage = curr - 1,
            total = doc.tsPlayer.getVar("playlistTotalPages");
            if(newpage < 0 || newpage >= total) {
                return;
            }

            // page selector will be updated on scroll event
            var jspApi = $("#torrentstream-body .playlist-box", doc).data("jsp");
            jspApi.scrollByY(0 - doc.tsPlayer.getVar("playlistPageHeight", 0), true);
            changeCurrentPlaylistPage(newpage, doc);
    });

    $("#torrentstream-body .playlist-next-page", doc).click(function(e) {
            e.preventDefault();

            var curr = doc.tsPlayer.getVar("playlistCurrentPage"),
            newpage = curr + 1,
            total = doc.tsPlayer.getVar("playlistTotalPages");
            if(newpage < 0 || newpage >= total) {
                return;
            }

            // page selector will be updated on scroll event
            var jspApi = $("#torrentstream-body .playlist-box", doc).data("jsp");
            jspApi.scrollByY(doc.tsPlayer.getVar("playlistPageHeight"), true);
            changeCurrentPlaylistPage(newpage, doc);
    });

    // playlist check/uncheck all
    $("#torrentstream-body a.playlist-check-all", doc).click(
        function(e) {
            e.preventDefault();
            var $box = $("#torrentstream-body .playlist-box", doc);
            if($(this).hasClass("checked")) {
                $(this).removeClass("checked");
                $(this).text(select);
                $box.find(".playlist-item", doc).removeClass("checked");
                $box.find(".playlist-play", doc).hide();
                $box.find(".playlist-check", doc).attr("checked", false);
            }
            else {
                $(this).addClass("checked");
                $(this).text(unSelect);
                $box.find(".playlist-item", doc).addClass("checked");
                $box.find(".playlist-play", doc).show();
                $box.find(".playlist-check", doc).attr("checked", true);
            }
            playlistUpdate(doc);
        });
    $("#torrentstream-body .player-controls .progress-placeholder", doc).mousedown(function(e){
            doc.tsPlayer.setVar("draggingProgress", true);
            doc.tsPlayer.setVar("dragStartPosition", doc.tsPlayer.position());
            doc.tsPlayer.setVar("dragPosition", e.pageX);
            return false;
    });

    $(doc).mousemove(function(e){
            if (doc.tsPlayer == null || doc.tsPlayer == undefined)
                return;
            if (!doc.tsPlayer.getVar("draggingProgress"))
                return;

            var dragStart = doc.tsPlayer.getVar("dragStartPosition");
            var dragCurrent = doc.tsPlayer.getVar("dragPosition");
            var parentWidth = $('.progress-wrap', doc).width();
            var newLeft = dragStart + (e.pageX - dragCurrent) / parentWidth;
            if (newLeft < 0.001)
                newLeft = 0.001;
            if (newLeft > 0.999)
                newLeft = 0.999;

            setPosition(doc, newLeft, true);
            $("#torrentstream-body .player-controls .progress-placeholder", doc).css("left", (newLeft*100)+"%");
            return false;
    });

    $(doc).mouseup(function(e){
            if (doc.tsPlayer == null || doc.tsPlayer == undefined)
                return;
            if (!doc.tsPlayer.getVar("draggingProgress"))
                return;
            doc.tsPlayer.setVar("draggingProgress", false);

            var dragStart = doc.tsPlayer.getVar("dragStartPosition");
            var dragCurrent = doc.tsPlayer.getVar("dragPosition");
            var parentWidth = $('.progress-wrap', doc).width();
            var newLeft = dragStart + (e.pageX - dragCurrent) / parentWidth;
            if (newLeft < 0.001)
                newLeft = 0.001;
            if (newLeft > 0.999)
                newLeft = 0.999;

            doc.tsPlayer.position(newLeft);
            return false;
    });

    $("#torrentstream-body .player-controls .progress-wrap", doc).mousedown(function(event){
            if(doc.tsPlayer.isBlocked())
                return;
            if (doc.tsPlayer.getVar("draggingProgress"))
                return;
            var pos = event.offsetX ? event.offsetX : event.pageX - $(this).offset().left;
            var w = $(this).width();
            doc.tsPlayer.position(pos / w);
    });
}


