
if (!google.maps.Polygon.prototype.getBounds) {  
	google.maps.Polygon.prototype.getBounds = function(latLng) {    
		var bounds = new google.maps.LatLngBounds();    
		var paths = this.getPaths();    
		var path;        
		
		for (var p = 0; p < paths.getLength(); p++) {      
			path = paths.getAt(p);      
				for (var i = 0; i < path.getLength(); i++) {        
					bounds.extend(path.getAt(i));      
				}    
		}    
		return bounds;  
	}
}


google.maps.Polygon.prototype.containsLatLng = function(latLng) {  
	var bounds = this.getBounds();  
	if(bounds != null && !bounds.contains(latLng)) {    
		return false;  
	}  
	
	var inPoly = false;  
	var numPaths = this.getPaths().getLength();  
	for(var p = 0; p < numPaths; p++) {    
		var path = this.getPaths().getAt(p);    
		var numPoints = path.getLength();    
		var j = numPoints-1;    
		for(var i=0; i < numPoints; i++) {       
			var vertex1 = path.getAt(i);      
			var vertex2 = path.getAt(j);      
			if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng())  {        
				if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {          
					inPoly = !inPoly;        
				}      
			}      
			j = i;    
		}  
	}  
	return inPoly;
}
