      var currentMarkerId = 0;
      var markersArray = new Array(null, null);
      var ruler = null;

    /* Dodaje metode do LatLng obliczajaca odleglosc do innego punktu */
    google.maps.LatLng.prototype.kmTo = function(a){
	var e = Math, ra = e.PI/180;
        var b = this.lat() * ra, c = a.lat() * ra, d = b - c;
	var g = this.lng() * ra - a.lng() * ra;
        var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d/2), 2) + e.cos(b) * e.cos(c) * e.pow(e.sin(g/2), 2)));
        return Math.round(f * 637813.7) / 100;
      }
    
    /* Dodaje linie pomiedzy punktami oraz oblicza odleglosc miedzy nimi */  
    function updateDistance(map, distanceContainerName) {
	try {
	if (ruler == null) {
	    ruler = new google.maps.Polyline({
		geodesic: true,
		map: map,
		clickable: false,
		strokeColor: "#0022FF",
		path: new Array(markersArray[0].getPosition(), markersArray[1].getPosition())
	    });
	} else {
	    ruler.setPath(new Array(markersArray[0].getPosition(), markersArray[1].getPosition()));
	}
	document.getElementById(distanceContainerName).innerHTML = 'Odległość: ' + markersArray[0].getPosition().kmTo(markersArray[1].getPosition()) + 'km';
	} catch (ex) {
	}
    }
    
    /* Dodaje nowy znacznik i wszystkie zdarzenia z nim zwiazane */
    function addMarker(map, distanceContainerName, event) {
       if (markersArray[currentMarkerId] != null) {
    	    markersArray[currentMarkerId].setMap(null);
    	    }
    	    
         markersArray[currentMarkerId] = new google.maps.Marker({
             position: event.latLng, 
             map: map,
             draggable: true,
             title: currentMarkerId.toString()
             });
             
	google.maps.event.addListener(markersArray[currentMarkerId], 'click', function() {
	    this.setMap(null);
	    if (ruler != null) {
		ruler.setMap(null);
		ruler = null;
	    }
	    currentMarkerId = new Number(this.getTitle());
	    markersArray[currentMarkerId] = null;
	});
	
	google.maps.event.addListener(markersArray[currentMarkerId], 'drag', function() {
	    updateDistance(map, distanceContainerName);
	    });
    
	currentMarkerId = (currentMarkerId + 1) % 2;
	updateDistance(map, distanceContainerName);
    }
       	
      function Ruler(map, distanceContainerName, active) {
      this.active = active;
      rulerObj = this;
       google.maps.event.addListener(map, 'click', function(event) {
        if (rulerObj.active == true)
    	    addMarker(map, distanceContainerName, event);
	});
      } 
   
