   var WINDOW_HTML = '<div style="width: 210px; padding-right: 10px"><a>Lokalizacja wybranego obiektu<\/a><\/div>';

   //------------------------------------------------------------

	var map = null;
	var bounds = null;
	var iconRB = null; 

	//var bounds = new GLatLngBounds();      	
	
    var side_bar_html = [];
    var gmarkers = [];
    var htmls = [];
    var i = 0;
   
	function setupMarkers(){
				
		window.setTimeout(clearOverlay, 10);

	}	
	
	var barrel_count = 0;
	
	//parses out xml file and grabs id (for use later) and address (for geocoding barrel)
	//then calls getAddress to geocode barrel
	function addBarrels(data){
  				
		var xml = GXml.parse(data);
  		var barrels = xml.documentElement.getElementsByTagName("marker");
		
		barrel_count = barrels.length;
		
		for (var i = 0; i < barrels.length; i++) {
    	
			var id = barrels[i].getAttribute("ID");
    		var address = barrels[i].getAttribute("address");
			var zipCode = barrels[i].getAttribute("zipcode");
			var lat = barrels[i].getAttribute("lat");
			var lng = barrels[i].getAttribute("lng");
			
            var town = barrels[i].getAttribute("town");
            var pop = barrels[i].getAttribute("pop");
			
			var search = address + "," + zipCode
			
			//if a barrel has never been geocoded, its lat/lng will be 0/0, so pass it into the geocoding function
			if(lat == 0.000000 || lng == 0.000000){
				getAddress(search,id);
			}else{ //if barrel has been geocoded, it will have coordinates, and just needs to have a marker created.
				createMarker(lat,lng,town,pop);
				//createMarker(lat,lng,town,town+"<br>Population: "+pop);
			}
			
  		}
  		
		var gallons_saved = (barrel_count * 54) * 65;
	
		//document.getElementById("rb_count").innerHTML = barrel_count;
		//document.getElementById("gallons").innerHTML = addCommas(gallons_saved);
			
	}
	
	var l = 0;
	
    function partialAddBarrels2() {
	    
	    //plynne ladowanie online uzuwac addmarke dla max_per_item 50, timeout 1000
	    
	    var max_per_iteration = 500;
	    var part_str = "";
	    var iter=1;

		//om.Set('Loading markers...');
	    
	    while (iter<=max_per_iteration && l < barrels.length) {
	    
			var id = barrels[l].getAttribute("ID");
    		var address = barrels[l].getAttribute("address");
			var zipCode = barrels[l].getAttribute("zipcode");
			var lat = barrels[l].getAttribute("lat");
			var lng = barrels[l].getAttribute("lng");
			
            var town = barrels[l].getAttribute("town");
            var pop = barrels[l].getAttribute("pop");
			
			var search = address + "," + zipCode
			
			//if a barrel has never been geocoded, its lat/lng will be 0/0, so pass it into the geocoding function
			if(lat == 0.000000 || lng == 0.000000){
				//getAddress(search,id);
			}else{ //if barrel has been geocoded, it will have coordinates, and just needs to have a marker created.
				createMarker(lat,lng,town,pop);
				//createMarker(lat,lng,town,town+"<br>Population: "+pop);
			}		    
		    		    
			l++;
	    	iter++;
	    
    	}
	    
	    if (l<barrels.length) {
			funcdelay = setTimeout('partialAddBarrels2()',1);   
	    } else {
		    //om.Clear();  //czyszczenie komunikatu robione jest po zaladowaniu legendy

		    // ===== determine the zoom level from the bounds =====
		    if (barrels.length == 1)
				map.setZoom( barrels[0].getAttribute("zoom") );
		    else
				map.setZoom(map.getBoundsZoomLevel(bounds));

			// ===== determine the centre from the bounds ======
			map.setCenter(bounds.getCenter());
    		
	    }
	    
	    return;	
	}
	
	var barrels;
	
	function loadBarrelsArray(data){
  				
		var xml = GXml.parse(data);
  		barrels = xml.documentElement.getElementsByTagName("marker");
  		
  		partialAddBarrels2();
 		
	}	
	
	//geocodes barrel (called from addBarrels) and then calls createNewMarker to create marker for map
	//createNewMarker creates a marker based on the geocoding response, then saves the lat longs into a mySQL database so that the 
	//barrel doesn't have to be geocoded again.
	function getAddress(address,id){
		//alert(address);
		geocoder.getLocations(address, function createNewMarker(response,address){
		
		if(response.Status.code = 200){
			var barrel = response.Placemark[0];
			var point = new GLatLng(barrel.Point.coordinates[1],barrel.Point.coordinates[0]);
			//var gmOpts = {icon:iconRB,clickable:false}; //dla clusterera
			var gmOpts = {icon:iconRB,clickable:false};
			var marker = new GMarker(point,gmOpts);	
			map.addOverlay(marker);
			
			//save lat long values in mySQL db
			//GDownloadUrl('rb_saveLatLng.php?ID=' + id + '&lat='+barrel.Point.coordinates[1]+'&lng='+barrel.Point.coordinates[0],nonSense);
		}
		
		
	});
	}
	
	//adds barrel marker to map based on lat/lng fields retrieved from XML
	function createMarker(lat,lng,name,html) {
		point = new GLatLng(lat,lng);
		//var gmOpts = {icon:iconRB,clickable:true}; //dla clusterera 
		var gmOpts = {clickable:true,title:name};
		//var gmOpts = {icon:iconRB,clickable:true,title:name};
		
		var marker = new GMarker(point,gmOpts);	
		//var marker = new PdMarker(point,gmOpts);	
		
		//map.addOverlay(marker);
		
        GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml(html,{maxWidth:200});
        });
        //save the info we need to use later for the side_bar
        gmarkers[i] = marker;
        htmls[i] = html;
        // add a line to the side_bar html
        //side_bar_html += '<img src="red_small.PNG" border=0><a href="javascript:myclick(' + i + ')">' + name + '</a>, '+lng+'°F / '+lat+'°C<br>';
        
        if (lat>0 && lng>0) {lat_title="N"; lng_title="E";}
        if (lat<0 && lng>0) {lat_title="S"; lng_title="E";}
        if (lat<0 && lng<0) {lat_title="S"; lng_title="W";}
        if (lat>0 && lng<0) {lat_title="N"; lng_title="W";}
        
        side_bar_html[i] = '<img src="red_small.PNG" border=0><a href="javascript:myclick(' + i + ')">' + name + '</a>, '+Math.round(lng*1000000)/1000000+'°'+lng_title+' / '+Math.round(lat*1000000)/1000000+'°'+lat_title+'<BR>';
            
        i++;
	
		//clusterer.AddMarker(marker,"");
		map.addOverlay(marker);

       	// ==== Each time a point is found, extent the bounds ato include it =====
       	//bounds.extend(marker.getPoint());	            
       	bounds.extend(point);	            
	
	}
	
	//adds commas to a number and returns a string
	function addCommas(nStr)
	{
		nStr += '';
		x = nStr.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}

	//blank call back function, GDownloadURL requires a call back, but we don't want to do anything with the response
	function nonSense(){}
		
	function clearOverlay(){ 

		// ===== determine the zoom level from the bounds =====
		map.setZoom(map.getBoundsZoomLevel(bounds));

		// ===== determine the centre from the bounds ======
		map.setCenter(bounds.getCenter());

        //zaladuje dane do warstwy 
        //partialSendToDiv();
        
        //om.Clear();  //jest w partialsendtodiv
        	
	}
	
    var tmp_i;
      
    // This function picks up the click and opens the corresponding info window
    function myclick(i) {
	  tmp_i=i;
	  map.panTo( gmarkers[i].getPoint() );
      //gmarkers[i].openInfoWindowHtml(htmls[i]);
      window.setTimeout('markerOpenInfoWindow(tmp_i)',100);
    }

    function markerOpenInfoWindow(i) {
      gmarkers[i].openInfoWindowHtml(htmls[i],{maxWidth:200});
    }
    
    var k=0;
    
    function partialSendToDiv() {
	    
	    var max_per_iteration = 50;
	    var part_str = "";
	    var iter=1;

		//om.Set('Loading legend...');
	    
		document.getElementById("side_bar_menu").style.display='';

	    while (iter<=max_per_iteration && k < side_bar_html.length) {
	    
		    addElement(side_bar_html[k]); //gdy chcemy na biezaco wyrzucac wyniki
	    	//part_str += side_bar_html[k];
	    	k++;
	    	iter++;
	    
    	}
	    
	    //addElement(part_str); //gdy wyrzucamy seriami
	    
	    //k++;
		//addElement(side_bar_html[k]);
	    
	    if (k<side_bar_html.length) {
			funcdelay = setTimeout('partialSendToDiv()',1);   
	    } else {
		    //om.Clear();
	    }
	    
	    return;
	    	    	    
	    while (iter<=max_per_iteration && iter <= side_bar_html.length) {
	    
	    	part_str += side_bar_html.shift();
	    	iter++;
	    
    	}
	    
	    document.getElementById("side_bar").innerHTML +=  part_str;  
	    //addElement(part_str);
	    
	    if (side_bar_html.length>0) {
			funcdelay = setTimeout('partialSendToDiv(k)',10000);   
	    } else {
		    //om.Clear();
	    }
	    
    }
        
    
	function addElement(value) {
		
		var ni = document.getElementById('side_bar');
		//var newdiv = document.createElement('div');
		//newdiv.innerHTML = value;
		//ni.appendChild(newdiv);
		var netxt=document.createElement('p');
		netxt.innerHTML = value;
		//var netxt=document.createTextNode(value);
		ni.appendChild(netxt);
	}    
	
   
	function LoadMapFromFile(filename, map_canvas)
	{
		//filename - pelna nazwa pliku np. php?alias= ...
		
		if (!map_canvas) map_canvas = "map_canvas"; //default map layer id
		
		x = 52.908902; //default point
		y = -3.515625; 
		zoom = 1;
		
		x = parseFloat(x);
		y = parseFloat(y);
		zoom = parseInt(zoom);		
	
		if (GBrowserIsCompatible()) {

				  
			//loading message
			//var om = new OverlayMessage(document.getElementById('map'),"#FFFFFF","#a5c2ff");
			//om.Set('Loading...');
		
		
		    // ===== Start with an empty GLatLngBounds object =====     
		    //var bounds = new GLatLngBounds();      	
		    bounds = new GLatLngBounds();      	
		
		//function setupMap(){
		
			map = new GMap2(document.getElementById(map_canvas));
			//map = new GMap2(document.getElementById("map")); //creates map	
			//map.setCenter(new GLatLng(39.999035,-75.124157), 10, G_PHYSICAL_MAP); //sets center and map type
			map.setCenter(new GLatLng(x,y), zoom, G_PHYSICAL_MAP); //sets center and map type
		    //map.addControl(new GLargeMapControl());
			map.addControl(new GSmallMapControl()); //adds pan and zoom control
			map.addControl(new GScaleControl()); //adds scale
	        map.addControl(new GMapTypeControl());
	        map.addControl(new GOverviewMapControl());
	        //map.addControl(new GSmallZoomControl());
	        
	        map.enableContinuousZoom();
			map.enableScrollWheelZoom();
	        
			//zoom levels
			//G_NORMAL_MAP.getMinimumResolution = function () { return 10 }; //sets min zoom level
			//G_NORMAL_MAP.getMaximumResolution = function () { return 15 }; //sets max zoom level
		    map.addMapType(G_PHYSICAL_MAP);
	    	map.setMapType(G_PHYSICAL_MAP); 
	    	
			window.setTimeout(setupMarkers, 3000);
			
			//clusterer object
			//var clusterer = new Clusterer(map);
			
		//}
	
			//custom rain barrel icon
			//var iconRB = new GIcon(); 
			iconRB = new GIcon(); 
			iconRB.image = 'marker.png';
		    iconRB.shadow = "http://www.google.com/mapfiles/shadow50.png";
			iconRB.shadowSize = new GSize(0, 0);
		    iconRB.iconSize = new GSize(20, 34);
		    iconRB.shadowSize = new GSize(37, 34);
		    iconRB.iconAnchor = new GPoint(9, 34);
		    iconRB.infoWindowAnchor = new GPoint(9, 2);
		    iconRB.infoShadowAnchor = new GPoint(18, 25);
				
			//custom rain barrel icon
			/*
			var icon_cluster_RB = new GIcon(); 
			icon_cluster_RB.image = 'blue_large.png';
		    icon_cluster_RB.shadow = 'shadow_large.png';
		    icon_cluster_RB.iconSize = new GSize( 30, 51 );
		    icon_cluster_RB.shadowSize = new GSize( 56, 51 );
		    icon_cluster_RB.iconAnchor = new GPoint( 13, 34 );
		    icon_cluster_RB.infoWindowAnchor = new GPoint( 13, 3 );
		    icon_cluster_RB.infoShadowAnchor = new GPoint( 27, 37 );
			*/
			var geocoder = new GClientGeocoder(); //geocoder object
			
			//override default cluster icon
			/*
			clusterer.SetIcon(icon_cluster_RB);
			clusterer.SetMinMarkersPerCluster(25);
		    clusterer.maxVisibleMarkers = 100;
		    clusterer.gridSize = 5;
		    clusterer.minMarkersPerClusterer = 5;
		    clusterer.maxLinesPerInfoBox = 6;	
		    */
			
			
			
			//calls php which generates xml file of barrel list, calls addBarrels which parses xml file
			
			//GDownloadUrl("radars_pl.xml", addBarrels); //ladowanie wszystkiego od razu
			GDownloadUrl(filename, loadBarrelsArray); //ladowanie markerow partiami, zeby clusterer nie zwolnil przegladarki
		

		}else {
      		//alert("Sorry, Google Maps is not compatible with this browser");
		    document.getElementById(map_canvas).innerHTML = "<h1>Browser not compatible with Google Maps. Sorry...</h1>" ;
	    }		
	   
	   
	}
   
   

	
    
    
   
   
   
   
   
   //------------------------------------------------------------
    
   function LoadMap(x,y,zoom, dataFormName, editable, map_canvas)
   {

	if (!map_canvas) map_canvas = "map_canvas"; //default map layer id
	   	
	var err = 0;
	//if (x=='') { x = 50.061712; err= -1; }; //default point
	//if (y=='') { y = 19.937353; err= -1; };
	//if (zoom=='' || err == -1) zoom = 13;
	
	if (x=='') { x = 52.908902; err= -1; }; //default point
	if (y=='') { y = -3.515625; err= -1; };
	if (zoom=='' || err == -1) zoom = 1;
	
	x = parseFloat(x);
	y = parseFloat(y);
	zoom = parseInt(zoom);
	   
    if (GBrowserIsCompatible()) 				// Do Map if Compatible Browser only
    {
     map = new GMap2(document.getElementById(map_canvas),{draggableCursor: 'crosshair', draggingCursor: 'pointer'}) ;
     map.addControl(new GLargeMapControl());

     var MapTypes = map.getMapTypes();
     MapTypes[0].getName= function() { return "Mapa";}
     MapTypes[1].getName = function() { return "Satelitarna";}
     MapTypes[2].getName = function() { return "Hybrydowa";}
     map.addControl(new GMapTypeControl());
     map.addControl(new GScaleControl()) ;
     map.addControl(new GOverviewMapControl()) ;
     
     map.enableContinuousZoom();
	 map.enableScrollWheelZoom();
     
     var latlng = new GLatLng(x,y) ; // Memphis Airport
     map.setCenter(latlng,zoom);

     map.setMapType(G_HYBRID_MAP);  //G_NORMAL_MAP; G_SATELLITE_MAP; G_HYBRID_MAP

     map.checkResize(); //chcek for IE7

     if (err >= 0) {

	     var marker; 
	 	 if (editable) {
	     	marker = new GMarker(new GLatLng(x,y), {draggable: true}  );
     	 } else {
	     	marker = new GMarker(new GLatLng(x,y) );
     	 }
	     map.addOverlay(marker);
	     GEvent.addListener(marker, "click", function() {
	       marker.openInfoWindowHtml(WINDOW_HTML);
	     });

 	 }
 	 
	 //map.panTo(marker);
     
	 if (editable) {
	
	     GEvent.addListener(map, 'click', function(overlay, point)	// Add a click listener
	     {
	      if (overlay)
	      {
	      } else if (point) 
	      {
	       addpoint( point, dataFormName ) ;  //nalezy to wylaczyc po uruchomieniu opcja draggable
	      }
	     });

	     GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel)	// Add a click listener
	     {
		    document.forms[dataFormName].elements['googlemaps_zoom'].value = map.getZoom();
		    //dodac centowanie do markera
     		//alert(new GLatLng(document.forms[dataFormName].elements['googlemaps_XY'].value));
     		//map.setCenter(latlng,zoom);
     		//alert(new GLatLng(document.forms[dataFormName].elements['googlemaps_XY'].value));
	     });
	     
	    //draggalbe 
        GEvent.addListener(marker, "dragstart", function() {
          map.closeInfoWindow();
        });

        GEvent.addListener(marker, "dragend", function() {
   		  var lat = marker.getPoint().lat(); //.toFixed(6); 
   		  var lng = marker.getPoint().lng(); //.toFixed(6); 

   		  var point = new GLatLng(lat,lng);
   		  
 		  document.forms[dataFormName].elements['googlemaps_XY'].value = point.toUrlValue();
   		  
          //marker.openInfoWindowHtml("Just bouncing along..."+point.toUrlValue());
        });	     
	     
	     
	     
     }


    } else
    {
	    document.getElementById(map_canvas).innerHTML = "<h1>Browser not compatible with Google Maps. Sorry...</h1>" ;
    }
   }


   function addpoint( point, dataFormName ) 
   {
    //document.data.markerdata.value += point.toUrlValue() + "\n" ;
    //alert(point.toUrlValue()) ;
    
    document.forms[dataFormName].elements['googlemaps_zoom'].value = map.getZoom();
    document.forms[dataFormName].elements['googlemaps_XY'].value = point.toUrlValue();
    
    //alert(document.forms[dataFormName].elements['googlemaps_zoom'].value) ;
    //alert(document.forms[dataFormName].elements['googlemaps_XY'].value) ;
    
    datadraw(dataFormName);
    
   }
   
   // Draw the markers associated with the points clicked...

   function datadraw(dataFormName) 
   {
    map.clearOverlays() ;
    var wrkar = [] ;
    if ( document.forms[dataFormName].elements['googlemaps_XY'].value )			// Check for markerdata
    {
     wrkar = dataparse( document.forms[dataFormName].elements['googlemaps_XY'].value ) ;
     for (var i = 0; i < wrkar.length; i++)
     {
	  var marker = new GMarker(wrkar[i], {draggable: true} )
      map.addOverlay( marker ) ;
      
       GEvent.addListener(marker, "click", function() {
         marker.openInfoWindowHtml(WINDOW_HTML);
       });
      
        //draggalbe
        GEvent.addListener(marker, "dragstart", function() {
          map.closeInfoWindow();
        });

        GEvent.addListener(marker, "dragend", function() {
   		  var lat = marker.getPoint().lat(); //.toFixed(6); 
   		  var lng = marker.getPoint().lng(); //.toFixed(6); 

   		  var point = new GLatLng(lat,lng);
   		  
 		  document.forms[dataFormName].elements['googlemaps_XY'].value = point.toUrlValue();
   		  
          //marker.openInfoWindowHtml("Just bouncing along..."+point.toUrlValue());
        });	      
       
       
     }
    }    
   }   
   
   
   // Parse the textarea data into a points array...   
   function dataparse( points )
   {
    points = points.substr(0,points.length - 1) ;
    var linar = points.split("\n") ;				// Break each point by line break
    var wrkar = [] ;
    var pntar = [] ;
    for (var i = 0; i < linar.length; i++)
    {
     wrkar = linar[i].split(",",2) ;				// Break each point into x and y
     pntar.push( new GLatLng(parseFloat(wrkar[0]), parseFloat(wrkar[1])) ) ; 
    }
    return pntar ;
   }   

/*
    var WINDOW_HTML = '<div style="width: 210px; padding-right: 10px"><a href="./signup.html">Przyłącz się<\/a> do Google Maps API lub <a href="./documentation/index.html">przeczytaj więcej o API<\/a>.<\/div>';

    if (GBrowserIsCompatible()) {
      var map = new GMap2(document.getElementById("map_canvas"));
      //map.addControl(new GSmallMapControl());

		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl()) ;
		map.addControl(new GOverviewMapControl()) ;


      map.setCenter(new GLatLng(37.4328, -122.077), 13);
      var marker = new GMarker(new GLatLng(37.4228, -122.085));
      map.addOverlay(marker);
      GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(WINDOW_HTML);
      });
      marker.openInfoWindowHtml(WINDOW_HTML);
    }
*/

