
    var map;
    var gdir;
    var geocoder = null;
    var addressMarker;
    var lsc;
    var l;
    var max_l;
    var no_places;
    var locale;
    var search_distance;
    var distances = [];    
    var distances_all = []; 
    var durations = [];    
    var durations_all = []; 

    var routes = [];
    var adr = [];

    function initialize(x, y, zoom) {
      if (GBrowserIsCompatible()) {      
        map = new GMap2(document.getElementById("map_canvas"));
        gdir = new GDirections(null, null);		
        gdir_true = new GDirections(map, document.getElementById("directions"));	
        GEvent.addListener(gdir, "load", onGDirectionsLoad);
        GEvent.addListener(gdir, "error", handleErrors);
        GEvent.addListener(gdir_true, "load", onTrueGDirectionsLoad);
        GEvent.addListener(gdir_true, "error", handleErrors);
	map.addControl(new GLargeMapControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
	map.enableScrollWheelZoom();
	var options = {
	      suppressZoomToBounds : false
      	};
	lsc=new google.maps.LocalSearch();
        map.addControl(lsc, 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 = "Długość trasy: 0 km. Czas przejazdu: 0 min.";

      }
    }
    
    function gotoLocation(location) 
    {
	lsc.execute(location);
    }

    function setDirections(adr1, adr8, adr2, adr3, adr4, adr5, adr6, adr7, search_type, loc) 
    {
        var adr_tmp = [];	

	var i1, i2, i3, i4, i5;

	adr_tmp[0]=adr1;
	adr_tmp[1]=adr2;
	adr_tmp[2]=adr3;
	adr_tmp[3]=adr4;
	adr_tmp[4]=adr5;
	adr_tmp[5]=adr6;
	adr_tmp[6]=adr7;
	adr_tmp[7]=adr8;

	

	search_distance=search_type;

	l=0;
	no_places=0;
	for (i1=0;i1<8;i1=i1+1)
	{
	   adr[i1]="";
	   if (adr_tmp[i1]!="")
	   {
		adr[no_places]=adr_tmp[i1];
	       no_places=no_places+1;
	       
	   }
	}
	
	
	for (i1=0;i1<8;i1=i1+1)
	{
	   for (i2=0;i2<8;i2=i2+1)
	   {
		if (adr[i1]!="" && adr[i2]!="" && i1<i2)
	        {
			routes[l]='from: ' + adr[i1] + ' to: '+adr[i2];
			//alert(routes[l]);
			l=l+1;	
			
		}
		
	   }
	}

	   

	locale=loc;
	//alert(l);
	max_l=l-1;
        l=0;

	//alert(adr);
	gdir.load(routes[0],  { "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- istnieje kilka miejscowości o tej samej nazwie (należy podać województwo albo miasto w pobliżu)\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("Serwer Google maps jest przeciążony proszę spróbować za chwilę. \n Kod błędu: " + gdir.getStatus().code);	   
	}

function onTrueGDirectionsLoad()
{	
	document.getElementById("getDistance").innerHTML = "<b>Długość trasy: "+gdir_true.getDistance().html +"; Czas przejazdu: "+gdir_true.getDuration().html+"</b>";
}


function onGDirectionsLoad()
 {	
	var i1, i2, i3, i4, i5, i6, i7, i8, i9;	
	var i_tab = [];
	var i_tab_limit = [];
	var i_tab_start = [];

	var next=1;


	if(gdir.getStatus().code == 200 && l<max_l) 
 	{	  
	   distances[l]=gdir.getDistance().meters;
	   durations[l]=gdir.getDuration().seconds;
	   //alert(distances[l]);	   
	   l=l+1;
	   //alert(routes[l]);	
	   gdir.load(routes[l],  { "locale": locale });
	   //alert(l);
	   next=0;
	   final=0;
	}
	if(gdir.getStatus().code == 200 && l==max_l && next==1) 
	{	   
	   distances[l]=gdir.getDistance().meters;
	   durations[l]=gdir.getDuration().seconds;
	   
	   //alert(distances);
	   i=0;
	   i_all=0;
	   //alert(no_places);
	   for (i1=0;i1<no_places;i1=i1+1)
	   for (i2=0;i2<no_places;i2=i2+1)
	   {
		if (i1==i2)
		{
		  distances_all[i_all]=0;
		  durations_all[i_all]=0;
		  i_all=i_all+1;
		}
		if (i1<i2)
		{
		  distances_all[i_all]=distances[i];
		  durations_all[i_all]=durations[i];
		  i_all=i_all+1;
		  i=i+1;
		}
		if (i1>i2)
		{
		  distances_all[i_all]=distances_all[i2*no_places+i1];
		  durations_all[i_all]=durations_all[i2*no_places+i1];
		  i_all=i_all+1;		
		}

		
	   }	  	  
	   //alert(distances);
	   //alert(distances_all);
	   //alert(no_places);
		
	   for (i=0;i<8;i++)	
	   {
		i_tab_start[i]=0;		
	   	if (i<no_places)
		  i_tab_limit[i]=no_places;
		else
		  i_tab_limit[i]=1;					
	   }
	   i_tab_limit[0]=1;
	   i_tab_start[no_places-1]=no_places-1;
	

	   var min_total_dist=9999999999999;
	   var min_total_duration=9999999999999;
	   var min_route_dist="";
	   var min_route_duration="";

	   for (i_tab[0]=i_tab_start[0];i_tab[0]<i_tab_limit[0];i_tab[0]=i_tab[0]+1)
	   for (i_tab[1]=i_tab_start[1];i_tab[1]<i_tab_limit[1];i_tab[1]=i_tab[1]+1)
	   for (i_tab[2]=i_tab_start[2];i_tab[2]<i_tab_limit[2];i_tab[2]=i_tab[2]+1)
	   for (i_tab[3]=i_tab_start[3];i_tab[3]<i_tab_limit[3];i_tab[3]=i_tab[3]+1)
	   for (i_tab[4]=i_tab_start[4];i_tab[4]<i_tab_limit[4];i_tab[4]=i_tab[4]+1)
	   for (i_tab[5]=i_tab_start[5];i_tab[5]<i_tab_limit[5];i_tab[5]=i_tab[5]+1)
	   for (i_tab[6]=i_tab_start[6];i_tab[6]<i_tab_limit[6];i_tab[6]=i_tab[6]+1)
	   for (i_tab[7]=i_tab_start[7];i_tab[7]<i_tab_limit[7];i_tab[7]=i_tab[7]+1)
	   {
		var ok=true;		
		for (i=0;i<no_places;i++)
		for (j=0;j<no_places;j++)
		{
		   if (i_tab[i]==i_tab[j] && i!=j)
		   {
			ok=false;			
		   }
		}
	 	if (ok)
		{
		  var total_dist=0;
		  var total_duration=0;
		  var total_route=""; 
  		  if (no_places>1)
		  {
		    total_dist+=distances_all[i_tab[0]*no_places+i_tab[1]];
		    total_duration+=durations_all[i_tab[0]*no_places+i_tab[1]];
		    total_route="from: "+adr[i_tab[0]];
		  }
		  if (no_places>2)
		  {
		    total_dist+=distances_all[i_tab[1]*no_places+i_tab[2]];
		    total_duration+=durations_all[i_tab[1]*no_places+i_tab[2]];
		    total_route+=" to: "+adr[i_tab[1]];
		  }
		  if (no_places>3)
		  {
		    total_dist+=distances_all[i_tab[2]*no_places+i_tab[3]];
		    total_duration+=durations_all[i_tab[2]*no_places+i_tab[3]];
		    total_route+=" to: "+adr[i_tab[2]];
		  }
		  if (no_places>4)
		  {
		    total_dist+=distances_all[i_tab[3]*no_places+i_tab[4]];
		    total_duration+=durations_all[i_tab[3]*no_places+i_tab[4]];
		    total_route+=" to: "+adr[i_tab[3]];
		  }
		  if (no_places>5)
		  {
		    total_dist+=distances_all[i_tab[4]*no_places+i_tab[5]];
		    total_duration+=durations_all[i_tab[4]*no_places+i_tab[5]];
		    total_route+=" to: "+adr[i_tab[4]];
		  }
		  if (no_places>6)
		  {
		    total_dist+=distances_all[i_tab[5]*no_places+i_tab[6]];
		    total_duration+=durations_all[i_tab[5]*no_places+i_tab[6]];
		    total_route+=" to: "+adr[i_tab[5]];
		  }	
		  if (no_places>7)
		  {
		    total_dist+=distances_all[i_tab[6]*no_places+i_tab[7]];
		    total_duration+=durations_all[i_tab[6]*no_places+i_tab[7]];
		    total_route+=" to: "+adr[i_tab[6]];
		  }
		  total_route+=" to: "+adr[no_places-1];

		  //alert(total_route);		
		  if (total_dist<min_total_dist)
		  {
		     min_total_dist=total_dist;
		     min_route_dist=total_route;
		  }
		  if (total_duration<min_total_duration)
		  {
		     min_total_duration=total_duration;
		     min_route_duration=total_route;
		  }

		}
		
		
	   }
	   if (search_distance==true)  	     
	   {
	      gdir_true.load(min_route_dist,  { "locale": locale }); 
	   }
	   else
	   {	     
	      gdir_true.load(min_route_duration,  { "locale": locale }); 
	   }
	  
	}
	
   }


