Make Embeds Resizeable

Автор: panzi

Описание: этот скрипт позволяет изменять размеры врезанных (embedded) видео-роликов (работающих через флеш-плеер).

Использование: установите скрипт, зайдите на любой сайт, где есть флеш-видео. Чтобы изменить размер видео, следует зайти в меню вашего скрипт-менеджера (вашим скрипт-менеджером может быть scripts.pngScriptish,  greasemonkey.pngGreasemonkey или ещё что-то).
В scripts.pngScriptish надо кликнуть по иконке дополнения ПКМ (или ЛКМ по стрелочке рядом с иконкой) и в открывшемся меню выбрать пункт User Script Commands, который содержит выпадающий список всех команд всех включённых скриптов. Там будет команда "Make Embeds Resizable". После того, как вы по ней кликните - в правом нижнем углу всех флеш-видео на странице должен появиться квадратик, который можно таскать мышью. При этом будет происходить и изменение размеров видео.

Аналоги: на страничке автора этого скрипта есть букмарклет версия этого скрипта. Копия этого же букмарклета на другом хостинге.

Установить: с USO.

Код скрипта

Выделить код

Код:

// ==UserScript==
// @name           Make Embeds Resizeable
// @namespace      http://twoday.tuwien.ac.at/pub/
// @description    makes flash videos resizeable
// @include        *
// ==/UserScript==

var body = document.getElementsByTagName("body")[0];
var MIN_SIZE = 15;

function insertAfter(node,newNode) {
    if (node.nextSibling == null) {
        node.parentNode.appendChild(newNode);
    }
    else {
        node.parentNode.insertBefore(newNode,node.nextSibling);
    }
}

function getDim(node,dim) {
    var value = node['offset'+dim.substring(0,1).toUpperCase()+dim.substring(1)];
    if (value != 0) { return value; }

    value = node[dim];
    if (value != undefined) { return parseInt(value); }

    value = node.style[dim];
    if (/.*py$/.test(value)) { return parseInt(value); }
    if (/.*em$/.test(value)) { return parseInt(value) * 16; }
    return 0;
}

function addListener(grabber,nodes_to_resize) {
    var mouseDown = false;
    var moveX  = 0;
    var moveY  = 0;
    var width  = 0;
    var height = 0;
    var preserveAspect = false;

    for (var i = 0; i < nodes_to_resize.length; ++ i) {
        var node = nodes_to_resize[i];

        if (width  == 0) { width  = getDim(node, 'width');  }
        if (height == 0) { height = getDim(node, 'height'); }
    }

    var aspect = width / height;

    grabber.style.left=(width - 10) + "px";
    grabber.style.top="-10px";

    grabber.addEventListener("mousedown", function(e) {
        if (e.button == 0) {
            preserveAspect = e.ctrlKey;
            aspect = width / height;
            body.style.MozUserSelect="none";
            mouseDown = true;
            moveX = e.pageX;
            moveY = e.pageY;
            return false;
        }
        return true;
    }, true);

    window.addEventListener("mousemove", function(e) {
        if (e.button == 0 && mouseDown) {
            var newWidth  = width  + e.pageX - moveX;
            var newHeight = height + e.pageY - moveY;

            if (preserveAspect && aspect != (newWidth/newHeight)) {
                newHeight = Math.sqrt(newWidth*newHeight/aspect);
                newWidth  = newHeight * aspect;
            }

            if (newWidth >= MIN_SIZE) {
                grabber.style.left=(newWidth-10)+"px";
                for (var i = 0; i < nodes_to_resize.length; ++ i) {
                    var node = nodes_to_resize[i];
                    node.style.width = newWidth+"px";
                    node.width = width = newWidth;
                }
                moveX = e.pageX;
            }

            if (newHeight >= MIN_SIZE) {
                for (var i = 0; i < nodes_to_resize.length; ++ i) {
                    var node = nodes_to_resize[i];
                    node.style.height = newHeight+"px";
                    node.height = height = newHeight;
                }
                moveY = e.pageY;
            }

            return false;
        }
        return true;
    }, true);

    window.addEventListener("mouseup", function(e) {
        if (e.button == 0 && mouseDown) {
            body.style.MozUserSelect="text";
            mouseDown = false;
            return false;
        }
        return true;
    }, true);
}

var madeResizeable = {};

function makeResizeable(node) {
    if (!madeResizeable[node]) {
        var prev = node;
        var nodes_to_resize = [node];

        while (prev.parentNode != undefined && (prev.parentNode.tagName == "OBJECT" || prev.parentNode.tagName == "A")) {
            prev = prev.parentNode;
            nodes_to_resize.push(prev);
        }

        var grabber = document.createElement("div");
        
        grabber.madeResizeable=true;
        grabber.style.width="15px";
        grabber.style.height="15px";
        grabber.style.borderStyle="solid";
        grabber.style.borderWidth="2px";
        grabber.style.borderColor="#333333";
        grabber.style.backgroundColor="#6a6a6a";
        grabber.style.cursor="se-resize";
        grabber.style.position="relative";
        grabber.style.MozUserSelect="none";

        addListener(grabber,nodes_to_resize);
        insertAfter(prev,grabber);

        for (var i = 0; i < nodes_to_resize.length; ++ i) {
            madeResizeable[nodes_to_resize[i]] = true;
        }
        madeResizeable[grabber] = true;
    }
}

function makeAllResizeable(nodes) {
    for (var i = 0; i < nodes.length; ++ i) {
        makeResizeable(nodes[i]);
    }
}

GM_registerMenuCommand("Make Embeds Resizable", function() {
    makeAllResizeable(document.getElementsByTagName("embed"));
    makeAllResizeable(document.getElementsByTagName("object"));
    makeAllResizeable(document.getElementsByTagName("textarea"));
}, undefined, undefined, "R");

Букмарклет можно взять здесь.