Ox.MapRectangleMarker = function(options, self) { var options = Ox.extend({ map: null, place: null, position: '' }, options), that = this; Ox.forEach(options, function(val, key) { that[key] = val; }); that.markerImage = new google.maps.MarkerImage that.marker = new google.maps.Marker({ cursor: that.position + '-resize', draggable: true, icon: new google.maps.MarkerImage( Ox.UI.PATH + 'png/ox.map/markerResize.png', new google.maps.Size(16, 16), new google.maps.Point(0, 0), new google.maps.Point(8, 8) ), position: that.place.points[that.position], raiseOnDrag: false }); function dragstart(e) { that.drag = { lat: e.latLng.lat(), lng: e.latLng.lng() }; } function drag(e) { // fixme: implement shift+drag (center stays the same) Ox.print(e.pixel.x, e.pixel.y) var lat = Ox.limit(e.latLng.lat(), Ox.MIN_LATITUDE, Ox.MAX_LATITUDE), lng = e.latLng.lng(); that.drag = { lat: lat, lng: lng }; if (that.position.indexOf('s') > -1) { that.place.south = lat; } if (that.position.indexOf('n') > -1) { that.place.north = lat; } if (that.position.indexOf('w') > -1) { that.place.west = lng; } if (that.position.indexOf('e') > -1) { that.place.east = lng; } Ox.print('west', that.place.west, 'east', that.place.east); Ox.print('south', that.place.south, 'north', that.place.north); that.place.update(); that.place.marker.update(); that.place.rectangle.update(); } function dragend(e) { var south; if (that.place.south > that.place.north) { south = that.place.south; that.place.south = that.place.north; that.place.north = south; that.place.update(); that.place.marker.update(); that.place.rectangle.update(); } } that.add = function() { that.marker.setMap(that.map.map); google.maps.event.addListener(that.marker, 'dragstart', dragstart); google.maps.event.addListener(that.marker, 'drag', drag); google.maps.event.addListener(that.marker, 'dragend', dragend); }; that.remove = function() { that.marker.setMap(null); google.maps.event.clearListeners(that.marker); }; that.update = function() { that.marker.setOptions({ position: that.place.points[that.position] }); }; return that; };