
    var map;
    var gdir;
    var geocoder = null;
    var addressMarker;

    function initialize(x, y, zoom) {
      if (GBrowserIsCompatible()) {      
        map = new GMap2(document.getElementById("map_canvas"));
        gdir = new GDirections(map, document.getElementById("directions"));	
        GEvent.addListener(gdir, "load", onGDirectionsLoad);
        GEvent.addListener(gdir, "error", handleErrors);
	map.addControl(new GLargeMapControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
	//map.enableScrollWheelZoom();
	var options = {
	      suppressZoomToBounds : false
      	};
        map.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(0,0)));
	var center = new GLatLng(x, y);
	//ads.enable();
        map.setCenter(center, zoom);


	document.getElementById("getDistance").innerHTML ="Odległość drogowa: 0 km. Odległość w linii prostej 0 km. Czas podróży: 0 min";
        //setDirections("Łódź", "Warszawa", "Rawa Mazowiecka; Sochaczew", "pl");

	var divs = document.getElementsByTagName('DIV');
	var divCounter = 1;
	for(var no=0;no<divs.length;no++){
		if(divs[no].className=='dhtmlgoodies_question'){
			divs[no].onclick = showHideContent;
			divs[no].id = 'dhtmlgoodies_q'+divCounter;
			var answer = divs[no].nextSibling;
			while(answer && answer.tagName!='DIV'){
				answer = answer.nextSibling;
			}
			answer.id = 'dhtmlgoodies_a'+divCounter;	
			contentDiv = answer.getElementsByTagName('DIV')[0];
			contentDiv.style.top = 0 - contentDiv.offsetHeight + 'px'; 	
			contentDiv.className='dhtmlgoodies_answer_content';
			contentDiv.id = 'dhtmlgoodies_ac' + divCounter;
			answer.style.display='none';
			answer.style.height='1px';
			divCounter++;
		}		
	}	

      }
	
    }
    
    function setDirections(fromAddress, toAddress, viaAddresses, locale) {

	var loadStr;

	loadStr = 'from:' + fromAddress;
		
	if (viaAddresses!="")
	{
		var viaValue = viaAddresses.replace(/[\n\r]+/,"");
		var viaSteps = viaValue.split(';');
	
		for (var n = 0 ; n< viaSteps.length ; n++ ) 
		{
			loadStr += ' to: ' + viaSteps[n];
		}
	}		
	
	loadStr += ' to: ' + toAddress;
	gdir.load(loadStr,  { "locale": locale });
	
    } 


    function handleErrors(){
	   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("Nie znaleziono podanego adresu. Proszę spawdzić wszystkie podane adresy. Możliwe przyczyny:\n- popełniono błąd w pisowni szukanego miejsca\n- podano niepełną nazwę miejscowości (np. Ostrowiec zamiast Ostrowiec Wielkopolski)\n- podana nazwę bardzo małej miejscowości (rozwiązaniem może być podanie nieco większej miejscowości znajdującej się w pobliżu)\n - miejscowości przez które przebiegać ma trasa przejazdu nie są oddzielone średnikami\nKod błedu: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("Błąd serwera. Proszę spróbować później.\n Kod błedu: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("Zbyt mało parametrów wejsciowych. Proszę wypełnić wszystkie pola.\n Kod błedu: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_UNAVAILABLE_ADDRESS)
	     alert("Trasa dojazdu nie może być wyznaczona ze względów prawnych.\n Kod błędu: " + gdir.getStatus().code);	     
	   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("Niepoprawny kod Google Maps. \n Kod błędu: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("Żądanie wyznaczenia trasy nie mogło zostać przetworzone.\n Kod błędu: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_UNKNOWN_DIRECTIONS)
	     alert("Trasa nie może zostać wyznaczona. Proszę o wpisanie innych danych wejściowych.\n Kod błędu: " + gdir.getStatus().code);
	   else 
             alert("Wystąpił nieznany błąd.");	   
	}

   function onGDirectionsLoad()
   {	
	if(gdir.getStatus().code == 200) 
 	{

	  var a = gdir.getGeocode(0);
	  var b = gdir.getGeocode(gdir.getNumGeocodes()-1);
		
	lat1=a.Point.coordinates[1];
	lon1=a.Point.coordinates[0];
	lat2=b.Point.coordinates[1];
	lon2=b.Point.coordinates[0];
	  
         // This is the start point of the requested direction
	//  var startpoint = new GLatLng(a.Point.coordinates[1],a.Point.coordinates[0]);

	document.getElementById("getDistance").innerHTML = "Odległość drogowa: <b>"+gdir.getDistance().html+"</b>"+" Odległość w linii prostej: "+distVincenty(lat1, lon1, lat2, lon2)+" km. Czas podróży: "+gdir.getDuration().html;
	}
   }

Number.prototype.toRad = function() {  // convert degrees to radians
  return this * Math.PI / 180;
}

Number.prototype.toDMS = function() {  // convert numeric degrees to deg/min/sec
  var d = Math.abs(this);  // (unsigned result ready for appending compass dir'n)
  d += 1/7200;  // add 1 second for rounding
  var deg = Math.floor(d);
  var min = Math.floor((d-deg)*60);
  var sec = Math.floor((d-deg-min/60)*3600);
  // add leading zeros if required
  if (deg<100) deg = '0' + deg; if (deg<10) deg = '0' + deg;
  if (min<10) min = '0' + min;
  if (sec<10) sec = '0' + sec;
  return deg + '\u00B0' + min + '\u2032' + sec + '\u2033';
}

Number.prototype.toLat = function() {  // convert numeric degrees to deg/min/sec latitude
  return this.toDMS().slice(1) + (this<0 ? 'S' : 'N');  // knock off initial '0' for lat!
}

Number.prototype.toLon = function() {  // convert numeric degrees to deg/min/sec longitude
  return this.toDMS() + (this>0 ? 'E' : 'W');
}

 
function distVincenty(lat1, lon1, lat2, lon2) {
  var a = 6378137, b = 6356752.3142,  f = 1/298.257223563;  // WGS-84 ellipsiod
  var L = (lon2-lon1).toRad();
  var U1 = Math.atan((1-f) * Math.tan(lat1.toRad()));
  var U2 = Math.atan((1-f) * Math.tan(lat2.toRad()));
  var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
  var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
  
  var lambda = L, lambdaP = 2*Math.PI;
  var iterLimit = 20;
  while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {
    var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
    var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + 
      (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
    if (sinSigma==0) return 0;  // co-incident points
    var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
    var sigma = Math.atan2(sinSigma, cosSigma);
    var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
    var cosSqAlpha = 1 - sinAlpha*sinAlpha;
    var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
    if (isNaN(cos2SigmaM)) cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
    var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
    lambdaP = lambda;
    lambda = L + (1-C) * f * sinAlpha *
      (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
  }
  if (iterLimit==0) return NaN  // formula failed to converge

  var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
  var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
  var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
  var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
    B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
  var s = b*A*(sigma-deltaSigma);
  
  s=s/1000;
  s = s.toFixed(0); 
  return s;
}


function toggleBox(szDivID, iState) // 1 visible, 0 hidden
{
    if(document.layers)	   //NN4+
    {
       document.layers[szDivID].visibility = iState ? "show" : "hide";
    }
    else if(document.getElementById)	  //gecko(NN6) + IE 5+
    {
        var obj = document.getElementById(szDivID);
        obj.style.visibility = iState ? "visible" : "hidden";
    }
    else if(document.all)	// IE 4
    {
        document.all[szDivID].style.visibility = iState ? "visible" : "hidden";
    }
}