var points = new OpenLayers.Layer.PointGrid({
    name: "Snap Grid",
    dx: 600, dy: 600,
    styleMap: new OpenLayers.StyleMap({
        pointRadius: 1,
        strokeColor: "#3333ff",
        strokeWidth: 1,
        fillOpacity: 1,
        fillColor: "#ffffff",
        graphicName: "square"
    })
});

var lines = new OpenLayers.Layer.Vector("Lines", {
    styleMap: new OpenLayers.StyleMap({
        pointRadius: 3,
        strokeColor: "#ff3300",
        strokeWidth: 3,
        fillOpacity: 0
    })
});

var map = new OpenLayers.Map({
    div: "map",
    layers: [new OpenLayers.Layer.OSM(), points, lines],
    controls: [
        new OpenLayers.Control.Navigation(),
        new OpenLayers.Control.LayerSwitcher(),
        new OpenLayers.Control.Attribution()
    ],
    restrictedExtent: new OpenLayers.Bounds(
        1035374, 7448940, 1074510, 7468508
    ),
    center: new OpenLayers.LonLat(1054942, 7458724),
    zoom: 13
});

// configure the snapping agent
var snap = new OpenLayers.Control.Snapping({
    layer: lines,
    targets: [{
        layer: points,
        tolerance: 15
    }]
});
snap.activate();

// add some editing tools to a panel
var panel = new OpenLayers.Control.Panel({
    displayClass: "olControlEditingToolbar"
});
var draw = new OpenLayers.Control.DrawFeature(
    lines, OpenLayers.Handler.Path,
    {displayClass: "olControlDrawFeaturePath", title: "Draw Features"}
);
modify = new OpenLayers.Control.ModifyFeature(
    lines, {displayClass: "olControlModifyFeature", title: "Modify Features"}
);
panel.addControls([
    new OpenLayers.Control.Navigation({title: "Navigate"}),
    modify, draw
]);
map.addControl(panel);

var rotation = document.getElementById("rotation");
rotation.value = String(points.rotation);
rotation.onchange = function() {
    points.setRotation(Number(rotation.value));
};

var spacing = document.getElementById("spacing");
spacing.value = String(points.dx);
spacing.onchange = function() {
    points.setSpacing(Number(spacing.value));
};

var max = document.getElementById("max");
max.value = String(points.maxFeatures);
max.onchange = function() {
    points.setMaxFeatures(Number(max.value));
};
