cutout/prototype/cutout-raphael.js
changeset 7 4edf6745bda5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cutout/prototype/cutout-raphael.js	Thu Jan 24 17:44:10 2013 +0100
@@ -0,0 +1,236 @@
+var startPath = "M0.5415 0.1793L0.5362 0.1550L0.5613 0.1389L0.5758 0.1583L0.6154 0.1599L0.6273 0.1696L0.6193 0.2051L0.5969 0.2245L0.5877 0.2003L0.5679 0.1954L0.5507 0.2116L0.5455 0.2294L0.5481 0.2536L0.5257 0.2552L0.5098 0.2390L0.5112 0.2100Z"
+
+$(function() {
+    
+    var PATHCOLOR = "#ff00ff",
+        SELECTEDCOLOR = "#ffff00",
+        HANDLESIZE = 6;
+    
+    var jqs = $(".cutout-canvas"),
+        offset = jqs.offset(),
+        paper = new Raphael(jqs[0]),
+        closed = false,
+        closeTimeout,
+        points = [];
+    
+    paper.rect(0, 0, paper.width, paper.height)
+        .attr({
+            stroke: "none",
+            fill: "#fff",
+            "fill-opacity": .01
+        })
+        .click(clickAddPoint)
+        .drag(
+            function(dx, dy, mx, my) {
+                
+                if (dx*dx+dy*dy < 4) {
+                    return;
+                }
+                
+                if (!pathDragging) {
+                    clearTimeout(closeTimeout);
+                    closed = true;
+                    resetPoints();
+                    for (var i = 0; i < 4; i++) {
+                        addPoint(mx - offset.left, my - offset.top)
+                    }
+                    redrawPath();
+                    pathDragging = true;
+                }
+                
+                var x = mx - offset.left,
+                    y = my - offset.top;
+                points[1].x = points[2].x = x;
+                points[2].y = points[3].y = y;
+                redrawPath();
+            },
+            function(mx, my) {
+                pathDragging = false;
+            },
+            function() {
+                setTimeout(function() {
+                    pointDragging = false;
+                },0);
+            }
+        );
+        
+    function resetPoints() {
+        points.forEach(function(p) {
+           p.handle.remove(); 
+        });
+        points = [];
+    }
+    
+    function addPoint(x, y) {
+        
+        var dragdeltax, dragdeltay, pointDragging,
+            point = {
+                x: Math.floor(x),
+                y: Math.floor(y)
+            }
+        
+        var pointrect = paper.rect(0, 0, HANDLESIZE, HANDLESIZE)
+            .attr({
+                stroke: PATHCOLOR,
+                fill: PATHCOLOR,
+                "fill-opacity": .3
+            })
+            .hover(shapeMouseOver, shapeMouseOut)
+            .drag(
+                function(dx, dy) {
+                    pointDragging = true;
+                    point.x = dx + dragdeltax;
+                    point.y = dy + dragdeltay;
+                    redrawPath();
+                },
+                function() {
+                    dragdeltax = point.x;
+                    dragdeltay = point.y;
+                },
+                function() {
+                    setTimeout(function() {
+                        pointDragging = false;
+                        shapeMouseOut(pointrect);
+                    },0);
+                }
+            )
+            .click(function() {
+                if (pointDragging) {
+                    return;
+                }
+                this.remove();
+                points = points.filter(function(p) {
+                    return p != point;
+                });
+                redrawPath();
+            });
+        
+        point.handle = pointrect;
+            
+        points.push(point);
+        
+    }
+    
+    function clickAddPoint(e, mx, my) {
+        
+        if (pathDragging) {
+            return;
+        }
+        
+        clearTimeout(closeTimeout);
+        closed = false;
+        
+        addPoint(mx - offset.left, my - offset.top);
+        
+        redrawPath();
+        
+        closeTimeout = setTimeout(function() {
+            closed = true;
+            redrawPath();
+        }, 1000)
+
+    }
+    
+    function shapeMouseOver() {
+        points.forEach(function(point) {
+            if (point.handle !== this) {
+                point.handle.attr({
+                    stroke: PATHCOLOR,
+                    fill: PATHCOLOR
+                });
+            }
+        });
+        if (this !== path) {
+            path.attr({
+                stroke: PATHCOLOR,
+                fill: PATHCOLOR
+            });
+        }
+        this.attr({
+            stroke: SELECTEDCOLOR,
+            fill: SELECTEDCOLOR
+        });
+    }
+    
+    function shapeMouseOut() {
+        if (pathDragging || !this || !this.attr) {
+            return;
+        }
+        this.attr({
+            stroke: PATHCOLOR,
+            fill: PATHCOLOR
+        });
+    }
+    
+    function redrawPath() {
+        var d = "M"
+            + points.map(function(p) { return p.x + " " + p.y }).join("L")
+            + (closed ? "Z" : "");
+        path.attr({
+            path: d
+        });
+        points.forEach(function(point) {
+            point.handle.attr({
+                x: point.x - HANDLESIZE / 2,
+                y: point.y - HANDLESIZE / 2
+            });
+        });
+        var transd = "M"
+            + points.map(function(p) { return (p.x / paper.width).toString().replace(/(\.\d{4})\d*/,"$1") + " " + (p.y / paper.height).toString().replace(/(\.\d{4})\d*/,"$1") }).join("L")
+            + "Z";
+        $(".path-text").text(transd);
+    }
+    
+    var dragdeltax, dragdeltay, pathDragging;
+    
+    var path = paper.path()
+        .attr({
+            stroke: PATHCOLOR,
+            fill: PATHCOLOR,
+            "fill-opacity": .1
+        })
+        .click(clickAddPoint)
+        .hover(shapeMouseOver, shapeMouseOut)
+        .drag(
+            function(dx, dy) {
+                pathDragging = true;
+                points.forEach(function(point) {
+                    point.x += dx - dragdeltax;
+                    point.y += dy - dragdeltay;
+                });
+                dragdeltax = dx;
+                dragdeltay = dy;
+                redrawPath();
+            },
+            function() {
+                dragdeltax = 0;
+                dragdeltay = 0;
+            },
+            function() {
+                setTimeout(function() {
+                    pathDragging = false;
+                    shapeMouseOut(path);
+                },0);
+            }
+        );
+    
+    $(".clear-fragment").click(function() {
+        resetPoints();
+        redrawPath();
+        return false;
+    });
+    
+    startPath.split(/[A-Z]/).forEach(function(coords) {
+        xy = coords.split(/[ ,]/);
+        if (xy.length === 2) {
+            addPoint(paper.width * parseFloat(xy[0]), paper.height * parseFloat(xy[1]));
+        }
+    });
+    
+    if (points.length) {
+        closed = true;
+    }
+    
+    redrawPath();
+
+});