      /**
       * funkcja tworzaca nowy marker
       */       
      function createMarker(point, name, html, icon) {
        var marker = new GMarker(point, {icon:icon});
        /*GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml(html);
        });*/
        gmarkers[i] = marker;
        i++;
        return marker;
      }
      
      /**
       * konwersja do radianow
       */
      function deg2rad(x) {
        return (x*3.141592654)/180;
      }
       
      /**
       * oblicza dystans miedzy dwoma punktami w kilometrach
       */
      function GetDistanceInKm(lat1, lng1, lat2, lng2) {
        return 6371*(Math.acos(Math.cos(deg2rad(lat1))*Math.cos(deg2rad(lat2))*Math.cos(deg2rad(lng2)-deg2rad(lng1))+Math.sin(deg2rad(lat1))*Math.sin(deg2rad(lat2))));
      }
      
      /**
       * wyswietlenie sklepow na mapie polski
       */     
      function ShowDirections(startPoint, endPoint) {
        /*wyswietlenie wskazowek*/
        directions = Array();
        dirOptions = { "getPolyline": true, "getSteps": false };
        
        for(i = 0; i < endPoint.length; i++) {
          directions[i] = new GDirections(map);
          directions[i].loadFromWaypoints(new Array(startPoint, endPoint[i]), dirOptions);
          GEvent.addListener(directions[i], "addoverlay", function(){
            var numMarkers = this.getNumGeocodes();
            for (var j = 0; j < numMarkers; j++) {
              var marker = this.getMarker(j);
              if (marker != null)
                marker.hide();
            }
          });
        }
      }
      
      /**
       * narysowanie granic polski
       */
      function ShowPolishBorder(map) {
        var polskaPoints=[
    			new GLatLng(53.748711,14.238281), new GLatLng(53.258641,14.425049), new GLatLng(53.067627,14.304199), new GLatLng(52.975108,14.161377),
    			new GLatLng(52.882391,14.161377), new GLatLng(52.716331,14.425049), new GLatLng(52.576350,14.633789), new GLatLng(52.375599,14.556885),
    			new GLatLng(52.234528,14.710693), new GLatLng(52.099757,14.699707), new GLatLng(51.842566,14.567871), new GLatLng(51.618017,14.743652),
    			new GLatLng(51.508742,14.732666), new GLatLng(51.447160,14.963379), new GLatLng(51.206883,15.007324), new GLatLng(50.889174,14.820557),
    			new GLatLng(50.889174,14.930420), new GLatLng(51.062113,15.095215), new GLatLng(50.937662,15.292969), new GLatLng(50.805935,15.380859),
    			new GLatLng(50.659908,16.062012), new GLatLng(50.659908,16.369629), new GLatLng(50.464498,16.237793), new GLatLng(50.120578,16.622314),
    			new GLatLng(50.282319,16.984863), new GLatLng(50.478483,16.875000), new GLatLng(50.282319,17.402344), new GLatLng(50.275299,17.753906),
    			new GLatLng(50.148746,17.611084), new GLatLng(49.986552,17.863770), new GLatLng(49.944150,18.347168), new GLatLng(49.731581,18.665771),
    			new GLatLng(49.518076,18.896484), new GLatLng(49.396675,19.072266), new GLatLng(49.610710,19.500732), new GLatLng(49.439557,19.610596),
    			new GLatLng(49.210420,19.775391), new GLatLng(49.224773,20.104980), new GLatLng(49.446700,20.621338), new GLatLng(49.317961,20.928955),
    			new GLatLng(49.396675,21.126709), new GLatLng(49.468124,21.434326), new GLatLng(49.382373,21.939697), new GLatLng(49.174522,22.159424),
    			new GLatLng(49.030665,22.851563), new GLatLng(49.174522,22.763672), new GLatLng(49.589349,22.664795), new GLatLng(50.373496,23.653564),
    			new GLatLng(50.464498,23.972168), new GLatLng(50.736455,24.016113), new GLatLng(50.840636,23.950195), new GLatLng(50.903033,24.158936),
    			new GLatLng(51.268789,23.752441), new GLatLng(51.488224,23.598633), new GLatLng(51.672555,23.521729), new GLatLng(51.849353,23.598633),
    			new GLatLng(52.086257,23.697510), new GLatLng(52.187405,23.411865), new GLatLng(52.281602,23.181152), new GLatLng(52.476089,23.378906),
    			new GLatLng(52.649729,23.708496), new GLatLng(52.722986,23.818359), new GLatLng(52.915527,23.928223), new GLatLng(53.363665,23.719482),
    			new GLatLng(53.904338,23.554688), new GLatLng(54.130260,23.499756), new GLatLng(54.278055,23.312988), new GLatLng(54.335744,23.071289),
    			new GLatLng(54.425322,22.884521), new GLatLng(54.393352,22.598877), new GLatLng(54.367759,20.643311), new GLatLng(54.444492,19.819336),
    			new GLatLng(54.239551,19.390869), new GLatLng(54.354956,19.171143), new GLatLng(54.367759,18.775635), new GLatLng(54.521081,18.511963),
    			new GLatLng(54.756331,18.402100), new GLatLng(54.616617,18.753662), new GLatLng(54.851315,18.369141), new GLatLng(54.838664,17.918701),
    			new GLatLng(54.692884,17.171631), new GLatLng(54.470038,16.314697), new GLatLng(54.284469,16.127930), new GLatLng(54.194583,15.534668),
    			new GLatLng(53.988395,14.589844), new GLatLng(53.905280,14.258890), new GLatLng(53.868725,14.551392), new GLatLng(53.768196,14.589844),
    			new GLatLng(53.685290,14.510520), new GLatLng(53.690201,14.375610), new GLatLng(53.748711,14.238281)
    		];
    		polskaPoly = new GPolygon(polskaPoints, '#003468', 4, 0.6, '#003468', 0.05);
    		map.addOverlay(polskaPoly);
  		}
      
      /**
       * wyswietlenie sklepow na mapie polski
       */     
      function ShowShopsInPoland() {
        map.clearOverlays();
        ShowPolishBorder(map);
        
        var sklepXML = "/sklepy.xml.php";
        var shopUrlId = -1;
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            for (var i = 0; i < markers.length; i++) {
                var id = parseFloat(markers[i].getAttribute("id"));
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new GLatLng(lat,lng);
                var html = markers[i].getAttribute("html");
                var label = markers[i].getAttribute("label");
                var marker = createMarker(point,label,html,shopIcon);
                map.addOverlay(marker);
                bounds.extend(point);
                urlVars = getUrlVars();
                if(urlVars && urlVars['shopid'] == id) 
                  shopUrlId = i;
            }
            /*if(userPoint) {
              map.addOverlay(userMarker);
              bounds.extend(userPoint);
            }*/
            if(shopUrlId != -1) 
              myclick(shopUrlId);
            else
              map.setCenter(polandPoint, polandZoom);
        });
      }
      
      
      /**
       * wyswietlenie sklepow na mapie polski
       */     
      function ShowShops() {
        var sklepXML = "/sklepy.xml.php";
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new GLatLng(lat,lng);
                var html = markers[i].getAttribute("html");
                var label = markers[i].getAttribute("label");
                var marker = createMarker(point,label,html,shopIcon);
                map.addOverlay(marker);
                bounds.extend(point);
            }
            var zoomLevel = map.getBoundsZoomLevel(bounds);
            
            if(zoomLevel < 6) zoomLevel = 6;
            if(zoomLevel > 15) zoomLevel = 15;
            map.setCenter(bounds.getCenter(), zoomLevel);
        });
      }
      
      /**
       * funkcja wywolujaca okienko z informacja o markerze
       */
      function myclick(i) {
        GEvent.trigger(gmarkers[i], "click");
        map.setCenter(gmarkers[i].getPoint(), 13);
      }
      
      function getUrlVars() {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
       
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      }
      
      /**
       * centruje i powieksza mape w punkcie uzytkownika
       */ 
      function ZoomToUser() {
        if(userPoint)
          map.setCenter(userPoint, 10);
        else
          alert('Nie podano lokalizacji');
      }
      
      /**
       * wyswietlenie sklepow w danym wojewodztwie
       */     
      function ShowShopsInState(stateID) {
        map.clearOverlays();
        
        var sklepXML = "/sklepy.xml.php";
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            var boundsExtended = false;
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new GLatLng(lat,lng);
                var html = markers[i].getAttribute("html");
                var label = markers[i].getAttribute("label");
                var state = markers[i].getAttribute("state");
                var marker = createMarker(point,label,html,shopIcon);
                map.addOverlay(marker);
                if(state == stateID) {
                  bounds.extend(point);
                  boundsExtended = true;
                  alert
                }
            }
            var zoomLevel = map.getBoundsZoomLevel(bounds);
            
            if(zoomLevel < 6) zoomLevel = 6;
            if(zoomLevel > 9) zoomLevel = 9;
            if(boundsExtended)
              map.setCenter(bounds.getCenter(), zoomLevel);
            else
              map.setCenter(polandPoint, polandZoom);
        });
      }
      
      /**
       * znajduje najblizszy sklep
       */
      function GetUserNearestShop() {
        if(!userPoint) {
          alert('Podaj swoją lokalizację i kliknij "Szukaj".');
          return;
        }
      
        map.clearOverlays();

        var sklepXML = "/sklepy.xml.php";
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            
            //obliczenie odleglosci miedzy uzytkownikiem a sklepami
            var shopMarkers = new Array();
            var distances = new Array();
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var html = markers[i].getAttribute("html");
                var label = markers[i].getAttribute("label");
                var shop_id = markers[i].getAttribute("id");
                shopMarkers[i] = new Array(lat, lng, html, label);
                distances[i] = GetDistanceInKm(userPoint.lat(), userPoint.lng(), lat, lng);
            }
            var min = 0;
            for(i = 1; i < distances.length; i++) {
              if(distances[min] > distances[i])
                min = i;
            }
            var nearestShopPoint = new GLatLng(shopMarkers[min][0], shopMarkers[min][1]);
            var nearestShopHtml = shopMarkers[min][2];
            var nearestShopLabel = shopMarkers[min][3];
            var nearestShopMarker = createMarker(nearestShopPoint, nearestShopLabel, nearestShopHtml, shopIcon);
            
            map.addOverlay(nearestShopMarker);
            bounds.extend(nearestShopPoint);
            map.addOverlay(userMarker);
            bounds.extend(userPoint);
            ShowDirections(userPoint, new Array(nearestShopPoint));
            map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
            GetUserNearestShopHTML();
        });
      }
      
      /**
       * znajduje najblizszy sklep
       */
      function GetUserNearestShopHTML() {
        if(!userPoint)
          return;
        var sklepXML = "/sklepy.xml.php";
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            
            //obliczenie odleglosci miedzy uzytkownikiem a sklepami
            var shopMarkers = new Array();
            var distances = new Array();
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var html = markers[i].getAttribute("html");
                var shop_id = markers[i].getAttribute("id");
                shopMarkers[i] = new Array(lat, lng, html, shop_id);
                distances[i] = GetDistanceInKm(userPoint.lat(), userPoint.lng(), lat, lng);
            }
            var min = 0;
            for(i = 1; i < distances.length; i++) {
              if(distances[min] > distances[i])
                min = i;
            }
            nearestShopHTML = shopMarkers[min][2];
            nearestShopID = shopMarkers[min][3];
            SetNearestShopDiv(nearestShopHTML, nearestShopID);
        });
      }
      
      
      function ShowUserNearestShop(userAddress) {
        geocoder.getLatLng(userAddress, function(latlng) {
          if (latlng) {
            userPoint = latlng;
            userMarker = createMarker(userPoint,'userMarker','Twoja lokalizacja',userIcon);
            GetUserNearestShop();
          }
          else
            alert('Nie znaleziono podanej lokalizacji. Spróbuj podać inną lokalizację.');
        });
      }
      
      /**
       * znajduje w zasięgu range
       */
      function ShowUserShopsInRange(range) {
        map.clearOverlays();

        var sklepXML = "/sklepy.xml.php";
        GDownloadUrl(sklepXML, function(data) {
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            var bounds = new GLatLngBounds();
            
            //obliczenie odleglosci miedzy uzytkownikiem a sklepami
            var ShopsInRange = new Array();
            for (var i = 0; i < markers.length; i++) {
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new GLatLng(lat,lng);
                var html = markers[i].getAttribute("html");
                var label = markers[i].getAttribute("label");
                distance = GetDistanceInKm(userPoint.lat(), userPoint.lng(), lat, lng);
                if(distance <= range) {
                  var marker = createMarker(point, label, html, shopIcon);
                  map.addOverlay(marker);
                  bounds.extend(point);
                  ShopsInRange.push(point);
                }  
            }
            map.addOverlay(userMarker);
            bounds.extend(userPoint);
            ShowDirections(userPoint, ShopsInRange);
            map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
        });
      }
      
      /**
       * wyswietla tylko uzytkownika na mapie
       */
      function ShowOnlyUser(map) {
        map.clearOverlays();
        ShowPolishBorder(map);
        map.addOverlay(userMarker);
        map.setCenter(polandPoint, polandZoom);
      }
      
      /**
       * ustaw lokalizacje uzytkownika
       */
      function SetUserLocation(userAddress) {
        geocoder.getLatLng(userAddress, function(latlng) {
          if (latlng) {
            userPoint = latlng;
            map.removeOverlay(userMarker);
            userMarker = createMarker(userPoint,'userMarker','Twoja lokalizacja',userIcon);
            map.addOverlay(userMarker);
          }
          else
            alert('Nie znaleziono podanej lokalizacji. Spróbuj podać inną lokalizację.');
        });
      }
      
      function SetNearestShopDiv(html, id) {
        var div = document.getElementById('nearestShop');
        if(!html) html = 'Podaj swoją lokalizację';
        div.innerHTML = '<a href="/?p0=25&amp;o=' + id + '">' + html + '</a>';
      }
      
      function GetUserAddress() {
        var country = 'poland';
        var city = document.getElementById('userCity').value;
        var address = document.getElementById('userAddress').value;
        if(!city) {
          alert('Proszę podać nazwę miasta.'); 
          return;
        }
        return country + ',' + city + ',' + address;
      }

