Wasn't it mahmudmia who wrote:
>

>I saw this property search sample in web -
>
>http://listings.myrealpage.com/wps/recip/9846/
>
>I am interested in the selection methods (rectangle, circle & poltgon)
>at the right side of the map control. I looked in this newsgroup and
>found dragzoom, selection zoom box etc...but could not find one which
>is nearly as complete as this one. Also, I could not get to find the
>javascript page where they implemented these methods (so I get to
>learn).

I've no idea how they hide their code from "View Source", but Web
Developer can see it. It's rather complicated. Here's the code that they
use to handle circles. There's a similar amount of code for each of the
other options:

var mrpGCircle = Class.create();

mrpGCircle.emptyVertexIconUrl = "polyvertex-empty.png";

mrpGCircle.vertexIconUrl = "polyvertex.png";

mrpGCircle.crosshairsCursor = "crosshairs.cur";



mrpGCircle.prototype.initialize = function( arg )

{

        if( arg["map"] == null ) {

                alert( "Must pass map to area in constructor" );

                return;

        }

        this.emptyVertexIconUrl = arg["emptyVertexIconUrl"] == null ?
mrpGCircle.emptyVertexIconUrl :

                arg["emptyVertexIconUrl"];

        this.vertexIconUrl = arg["vertexIconUrl"] == null ?
mrpGCircle.vertexIconUrl :

                arg["vertexIconUrl"];

        this.crosshairsCursor = arg["crosshairsCursor"] == null ?
mrpGCircle.crosshairsCursor :

                arg["crosshairsCursor"];

        this.closed = false;

        this.editing = false;

        this.map = arg["map"];

        this.normalProj = G_NORMAL_MAP.getProjection();

        this.vertices = new Array();

        this.points = new Array();

        this.editable = arg["editable"] == null ? false :
arg["editable"];

        this.strokeColor = arg["strokeColor"] == null ? "#C602C8" :
arg["strokeColor"];

        this.fillColor = arg["fillColor"] == null ? "#C602C8" :
arg["fillColor"];

        this.strokeWidth = arg["strokeWidth"] == null ? 5 :
arg["strokeWidth"];

        this.strokeOpacity = arg["strokeOpacity"] == null ? 0.8 :
arg["strokeOpacity"];

        this.fillOpacity = arg["fillOpacity"] == null ? 0.3 :
arg["fillOpacity"];

        this.centerLatLng = arg["centerLatLng"] == null ? null :
arg["centerLatLng"];

        this.radiusLatLng = arg["radiusLatLng"] == null ? null :
arg["radiusLatLng"];

        this.clickable = arg["clickable"] == null ? false :
arg["clickable"];

        if( arg["spec"] ) {

                var pts = arg["spec"].split( "," );

                for( var i=0; i<pts.length; ++i ) {

                        pts[i] = parseFloat( pts[i] );

                }

                this.centerLatLng = new GLatLng( pts[0], pts[1] );

                this.radiusLatLng = new GLatLng( pts[2], pts[3] );

        }

        this.tooltipsOn = arg["tooltipsOn"] == null ? false :
arg["tooltipsOn"];

        this.tooltip = null;

        this.feedbackLineWidth = 2;

        this.overlay = null;

        this.verticesOn = true;

        this.feedbackLine = null;

        var self = this;



        if( this.centerLatLng && this.radiusLatLng ) {

                this.closed = true;

                this.render();

                this.showVertices( true );

        }

        else if( this.editable ) {

                this.startEditing();

        }

        mrpGSnapHelper.addSnapArea(this);

};



mrpGCircle.prototype.showTooltip = function( latlng )

{

        if( !this.tooltipsOn && this.tooltip ) {

                this.tooltip.remove();

                this.tooltip = null;

        }

        if( !this.tooltipsOn ) {

                return;

        }

        if( !this.centerLatLng && !this.radiusLatLng ) {

                this.setTooltipText( "- Click on the map to create the
<span class='keyword'>CENTER</span> of the circle" );

        }

        else if( this.centerLatLng && !this.radiusLatLng ){

                this.setTooltipText( "- Move the mouse and click to
create the <span class='keyword'>EDGE</span> of the circle" );

        }

        this.tooltip.setPosition( latlng );

}



mrpGCircle.prototype.setTooltipText = function( text )

{

        if( this.tooltip == null ) {

                this.tooltip = new mrpGMouseTooltip( {

                        "text" : text,

                        "map" : this.map

                } );

        }

        else {

                this.tooltip.setText( text );

        }

}



mrpGCircle.prototype.getSnappablePoints = function()

{

        if( this.centerLatLng && this.radiusLatLng ) {

                return [ this.centerLatLng, this.radiusLatLng ];

        }

        else {

                return [];

        }

}



mrpGCircle.prototype.getCurrentPolygon = function()

{

        if( this.closed ) {

                return this.overlay;

        }

        else {

                return null;

        }

};



mrpGCircle.prototype.setOnPolygonCloseCallback = function( callback )

{

        this.polygonCloseCallback = callback;

};



mrpGCircle.prototype.setOnPolygonEditedCallback = function( callback )

{

        this.polygonEditedCallback = callback;

};



mrpGCircle.prototype.startEditing = function()

{

        if( !this.editable ) {

                return;

        }

        this.stopEditing();

        this.editing = true;

        var self = this;

        this.clickListener = GEvent.addListener( this.map, "click",

                function( marker, point ) {

                        self.processClick( marker, point );

                } );

        if( !this.closed ) {

                this.mouseListener = new GEvent.addListener( this.map,
"mousemove",

                        function( latlng ) {

                                self.showTooltip( latlng );

                                self.renderFeedbackLine( latlng );

                        } );

        }

        this.map.disableDoubleClickZoom();

        if( !this.closed ) {

                this.map.getDragObject().setDraggableCursor( 'url(' +

                        this.crosshairsCursor + '),crosshair' );

        }

        if( this.closed && this.radiusLatLng ) {

                this.renderFeedbackLine( this.radiusLatLng );

        }

};



mrpGCircle.prototype.stopEditing = function()

{

        if( !this.editable ) {

                return;

        }

        if( this.clickListener ) {

                GEvent.removeListener( this.clickListener );

                this.clickListener = null;

        }

        if( this.mouseListener ) {

                GEvent.removeListener( this.mouseListener );

                this.mouseListener = null;

        }

        if( this.feedbackLine ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }

        if( this.tooltip ) {

                this.tooltip.remove();

                this.tooltip = null;

        }

        this.editing = false;

        this.map.getDragObject().setDraggableCursor( 'default' );

};



mrpGCircle.prototype.renderFeedbackLine = function( mousePoint )

{

        if( this.centerLatLng == null ) {

                return;

        }

        if( this.feedbackLine != null ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }

        this.feedbackLine = new GPolyline( [ this.centerLatLng,
mousePoint ], "#000000", this.feedbackLineWidth, 1.0,

                { "clickable" : false } );

        this.map.addOverlay( this.feedbackLine );

};



mrpGCircle.prototype.processClick = function( marker, point )

{

        if( !this.editable ) {

                return;

        }

        var wasClosed = this.closed;

        if( !this.closed ) {



                if( marker ) {

                        point = marker.getLatLng();

                }



                if( this.centerLatLng == null ) {

                        this.centerLatLng = point;

                        this.createVertex( this.centerLatLng, true );

                }

                else {

                        this.radiusLatLng = point;

                        this.createVertex( this.radiusLatLng, false );

                        this.closed = true;

                        if( this.mouseListener ) {

                                GEvent.removeListener(
this.mouseListener );

                                this.mouseListener = null;

                        }

                        if( this.feedbackLine && !this.verticesOn ) {

                                this.map.removeOverlay(
this.feedbackLine );

                                this.feedbackLine = null;

                        }

                        if( this.tooltip ) {

                                this.tooltip.remove();

                                this.tooltip = null;

                        }

                        this.createCircle();

                        this.map.getDragObject().setDraggableCursor(
'default' );

                }



                this.render();

        }

        if( wasClosed != this.closed && this.polygonCloseCallback ) {

                this.polygonCloseCallback( this );

        }

};



mrpGCircle.prototype.createCircle = function()

{

        var zoom = this.map.getZoom();

        var centerPt =
this.normalProj.fromLatLngToPixel(this.centerLatLng, zoom);

        var radiusPt =
this.normalProj.fromLatLngToPixel(this.radiusLatLng, zoom);



        var circlePoints = new Array();



        var radius =
Math.floor(Math.sqrt(Math.pow((centerPt.x-radiusPt.x),2) +

                Math.pow((centerPt.y-radiusPt.y),2)));



        for (var a = 0 ; a < 361 ; a+=10 ) {

                var aRad = a*(Math.PI/180);

                var y = centerPt.y + radius * Math.sin(aRad);

                var x = centerPt.x + radius * Math.cos(aRad);

                var p = new GPoint(x,y);

                circlePoints.push( this.normalProj.fromPixelToLatLng(p,
zoom) );

        }

        this.points = circlePoints;

}



mrpGCircle.prototype.getEndVertexIcon = function()

{

        var icon = new GIcon();

        icon.image = this.vertexIconUrl;

        icon.iconSize = new GSize(10, 10);

        icon.iconAnchor = new GPoint(5, 5);

        return icon;

};



mrpGCircle.prototype.getVertexIcon = function()

{

        var icon = new GIcon();

        icon.image = this.emptyVertexIconUrl;

        icon.iconSize = new GSize(10, 10);

        icon.iconAnchor = new GPoint(5, 5);

        return icon;

};



mrpGCircle.prototype.createVertex = function( point, isOpen )

{

        if( !this.verticesOn ) {

                return null;

        }

        var vertex = null;

        if( isOpen ) {

                vertex = new GMarker( point, {

                        "icon" : this.getEndVertexIcon(),

                        "draggable" : this.editable,

                        "bounceGravity" : 0,

                        "dragCrossMove" : 1,

                        "bouncy" : false

                        } );

        }

        else {

                vertex = new GMarker( point, {

                        "icon" : this.getVertexIcon(),

                        "draggable" : this.editable,

                        "dragCrossMove" : 1,

                        "bounceGravity" : 0,

                        "bouncy" : false

                        } )

        }

        var self = this;

        if( this.editable ) {

                GEvent.addListener( vertex, "dragstart", function() {

                        self.onVertexDragStart( vertex );

                });

                GEvent.addListener( vertex, "drag", function() {

                        self.onVertexDrag( vertex );

                });

                GEvent.addListener( vertex, "dragend", function() {

                        self.onVertexDragEnd( vertex );

                });

        }

        this.map.addOverlay( vertex );

        this.vertices.push( vertex );;
        return vertex;

};



mrpGCircle.prototype.showVertices = function( flag )

{

        this.verticesOn = flag;

        for( var i=0; i<this.vertices.length; ++i ) {

                this.map.removeOverlay( this.vertices[i] );

        }

        this.vertices = new Array();

        if( this.feedbackLine ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }

        if( flag ) {

                this.createVertex( this.centerLatLng, true );

                this.createVertex( this.radiusLatLng, false );

                this.renderFeedbackLine( this.radiusLatLng );

        }

};



mrpGCircle.prototype.render = function()

{

        this.destroyOverlay();

        if( this.radiusLatLng && this.centerLatLng ) {

                this.points = new Array();

                this.createCircle();

        }

        if( this.points.length > 2 ) {

                this.overlay = new GPolygon( this.points,
this.strokeColor, this.strokeWidth,

                                        this.strokeOpacity,
this.fillColor, this.fillOpacity,

                                        { "clickable" : this.clickable }
);

                this.map.addOverlay( this.overlay );

        }

};



mrpGCircle.prototype.destroyOverlay = function()

{

        if( this.overlay != null ) {

                this.map.removeOverlay( this.overlay );

                this.overlay = null;

        }

};



mrpGCircle.prototype.onVertexDragStart = function( marker )

{

};



mrpGCircle.prototype.onVertexDrag = function( marker )

{

        if( this.feedbackLine != null ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }



        if( !this.closed ) {

                return;

        }



        if( marker == this.vertices[0] ) {

                this.feedbackLine = new GPolyline( [ marker.getLatLng(),
this.radiusLatLng ], "#000000", this.feedbackLineWidth, 1.0 );

        }

        else {

                this.feedbackLine = new GPolyline( [ this.centerLatLng,
marker.getLatLng() ], "#000000", this.feedbackLineWidth, 1.0 );

        }



        this.map.addOverlay( this.feedbackLine );

};



mrpGCircle.prototype.onVertexDragEnd = function( marker )

{

        this.destroyOverlay();

        var thePoint = marker.getLatLng();

        var closestPoint = mrpGSnapHelper.findSnapPoint( this, this.map,
thePoint, 5.0 );

        if( closestPoint ) {

                thePoint = closestPoint;

                marker.setLatLng( thePoint );

        }

        if( marker == this.vertices[0] ) {

                this.centerLatLng = thePoint;

        }

        else {

                this.radiusLatLng = thePoint;

        }

        this.render();

        if( this.feedbackLine ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }

        this.feedbackLine = new GPolyline( [ this.centerLatLng,
this.radiusLatLng ], "#000000", this.feedbackLineWidth, 1.0 );

        this.map.addOverlay( this.feedbackLine );



        if( this.polygonEditedCallback ) {

                this.polygonEditedCallback( this );

        }

};



mrpGCircle.prototype.destroy = function()

{

        //GEvent.removeListener( mrpGArea.clickListener );

        this.destroyOverlay();

        for( var i=0; this.vertices && i<this.vertices.length; ++i ) {

                this.map.removeOverlay( this.vertices[i] );

                this.vertices[i] = null;

        }

        this.vertices = new Array();

        this.overlay = null;

        this.stopEditing();

        if( this.feedbackLine ) {

                this.map.removeOverlay( this.feedbackLine );

                this.feedbackLine = null;

        }

        if( this.tooltip ) {

                this.tooltip.remove();

                this.tooltip = null;

        }

        mrpGSnapHelper.removeSnapArea(this);

        this.map.getDragObject().setDraggableCursor( 'default' );

};


-- 
http://econym.org.uk/gmap
The Blackpool Community Church Javascript Team


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Maps API" group.
To post to this group, send email to Google-Maps-API@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Maps-API?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to