<html>
<head>
<script language="javascript">
<!--

SVG_NS = 'http://www.w3.org/2000/svg';

function pathFromStar (radius, innerRadius, sides) {
    var path = [];
    for (var i = 0; i < sides * 2; ++i) {
        var theta = Math.PI * i / sides + (Math.PI / 2);
        var r = (i % 2) ? radius : innerRadius;
        var x = r * Math.cos(theta);
        var y = r * Math.sin(theta);
        path.push((i ? 'L' : 'M'), x, y);
    }
    path.push('Z');
    return path.join(' ');
}

function newSvgElement (tagName, parentNode, attrs) {
    var node = document.createElementNS(SVG_NS, tagName);
    if (attrs) {
        for (var k in attrs) {
            node.setAttribute(k, attrs[k]);
        }
    }
    if (parentNode) {
        parentNode.appendChild(node);
    }
    return node;
}

function setCenterPosition (node, x, y) {
    node.setAttribute('transform', 'translate($1, $2)'
        .replace('$1', x)
        .replace('$2', y));
}

var armed = null;

window.addEventListener('load', function () {

    var svgContainer = newSvgElement('svg', document.body);
    var shapes = [
        { pos: [ 100, 100 ], size: 60, hasStroke: false },
        { pos: [ 250, 100 ], size: 60, hasStroke: true },
        { pos: [ 400, 100 ], size: 50, hasStroke: true }
    ];
    svgContainer.style.WebkitSvgShadow = '5px 5px 5px red';
    svgContainer.style.opacity = '0.5';
    for (var i = 0; i < shapes.length; ++i) {
        var shape = shapes[i];
        var group = newSvgElement('g', svgContainer);
        var node = newSvgElement('path', group, {
            d: pathFromStar(shape.size, shape.size / 2, 5),
            fill: '#999',
            stroke: 'black',
            'stroke-width': 10,
        });
        setCenterPosition(node, shape.pos[0], shape.pos[1]);
        if (shapes[i].hasStroke) {
            node.setAttribute('stroke-dasharray', 20);
        }
        node.addEventListener('mousedown', function (ev) {
            var e = ev || event;
            armed = { node: e.target || e.srcElement };
        });
        node.addEventListener('mouseup', function () {
            armed = null;
        });
    }
    window.addEventListener('mousemove', function (ev) {
        if (armed) {
            var e = ev || event;
            setCenterPosition(armed.node, e.clientX, e.clientY);
        }
    });
});

//-->
</script>
</head>
<body>

</body>
</html>
