function voteMap(map_id, vote) {
  http_request = false;

  if (window.XMLHttpRequest) {
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
    }
  } else if (window.ActiveXObject) {
    try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
    }
  }

  http_request.open('GET', 'vote.php?mode=vote&id='+map_id+'&vote='+vote, true);
  http_request.onreadystatechange = function(){
    if (http_request.readyState == 4) {
      if (http_request.status == 200) {
        var response = http_request.responseText.split("|");
        document.getElementById('map_'+map_id).innerHTML = '<strong>'+response[0]+'</strong>';
        document.getElementById('map_votes_'+map_id).innerHTML = response[1];
      }
    }
  };
  http_request.send(null);
}

function addMapSubmit() {
  if (document.forms['formAddMap'].elements['name'].value.length <= 3 || document.forms['formAddMap'].elements['google_map_lat'].value == '' || document.forms['formAddMap'].elements['google_map_lon'].value == '' || document.forms['formAddMap'].elements['google_map_zoom'].value == '') {
    alert('Wypełnij wszystkie wymagane pola.');
    return false;
  } else {
    return true;
  }
}

var map;
var marker;
var geo;
var zoom;
var reasons = [];
var old_marker;

function copyCoords(x, y, z) {
  document.forms['formAddMap'].elements['google_map_lat'].value = x;
  document.forms['formAddMap'].elements['google_map_lon'].value = y;
  document.forms['formAddMap'].elements['google_map_zoom'].value = z;
  return true;
}

function getZoomLevel(y, maptype) {
  var zoomOffset = 0;
  if (y > 0) {
    zoomOffset = Math.round(Math.log(y*432) / Math.LN2);
    if (zoomOffset < 0) { zoom = 0; }
  }

  zoom = maptype.getMaximumResolution(0) - zoomOffset;
  return zoom;
}

function createMarker(point) {
  if (old_marker) {
    map.removeOverlay(old_marker);
  }

  marker = new GMarker(point);
  document.forms['formAddMap'].elements['google_map_lat'].value = point.x;
  document.forms['formAddMap'].elements['google_map_lon'].value = point.y;
  document.forms['formAddMap'].elements['google_map_zoom'].value = map.getZoom();
  map.addOverlay(marker);
  old_marker = marker;
  return marker;
}

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(54.977614, 16.171875), 4, G_HYBRID_MAP);

    createMarker(new GLatLng(54.977614, 16.171875));

    GEvent.addListener(map, "click", function(marker, point) {
      if (marker) {
        copyCoords('', '', '');
      } else {
        createMarker(point);

        copyCoords(point.x, point.y, map.getZoom());
      }
    });

    GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
      if (old_marker) {
        copyCoords(old_marker.getPoint().lng(), old_marker.getPoint().lat(), map.getZoom());
      }
    });

    geo = new GClientGeocoder();
    reasons[G_GEO_SUCCESS]            = 'Sukces';
    reasons[G_GEO_MISSING_ADDRESS]    = 'Pusty adres: Adres jest pusty.';
    reasons[G_GEO_UNKNOWN_ADDRESS]    = 'Nieznany adres:  Nie udało się znaleźć koordynatów pasujących do danego adresu.';
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= 'Niedostępny adres:  Koordynaty podanej lokalizacji nie mogą zostać zwrócone ze względów prawnych.';
    reasons[G_GEO_BAD_KEY]            = 'Zły klucz: Klucz API nie pasuje do domeny.';
    reasons[G_GEO_TOO_MANY_QUERIES]   = 'Za dużo zapytań: Dzienny limit zapytań dla tej domeny został przekroczony.';
    reasons[G_GEO_SERVER_ERROR]       = 'Błąd serwera: Zapytanie o koordynaty nie mogło zostać przetworzone.';
  }
}

function load2(lat, lon, zoom) {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map2"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(lat, lon), zoom, G_HYBRID_MAP);

    createMarker(new GLatLng(lat, lon));

    GEvent.addListener(map, "click", function(marker, point) {
      if (marker) {
        copyCoords('', '', '');
      } else {
        createMarker(point);

        copyCoords(point.x, point.y, map.getZoom());
      }
    });

    GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
      if (old_marker) {
        copyCoords(old_marker.getPoint().lng(), old_marker.getPoint().lat(), map.getZoom());
      }
    });

    geo = new GClientGeocoder();
    reasons[G_GEO_SUCCESS]            = 'Sukces';
    reasons[G_GEO_MISSING_ADDRESS]    = 'Pusty adres: Adres jest pusty.';
    reasons[G_GEO_UNKNOWN_ADDRESS]    = 'Nieznany adres:  Nie udało się znaleźć koordynatów pasujących do danego adresu.';
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= 'Niedostępny adres:  Koordynaty podanej lokalizacji nie mogą zostać zwrócone ze względów prawnych.';
    reasons[G_GEO_BAD_KEY]            = 'Zły klucz: Klucz API nie pasuje do domeny.';
    reasons[G_GEO_TOO_MANY_QUERIES]   = 'Za dużo zapytań: Dzienny limit zapytań dla tej domeny został przekroczony.';
    reasons[G_GEO_SERVER_ERROR]       = 'Błąd serwera: Zapytanie o koordynaty nie mogło zostać przetworzone.';
  }
}

function googleMapLink() {
  var search = document.forms['formAddMap'].elements['link'].value;
  var maplink = search.match(/http:\/\/[a-z]+.google.com\/[a-z]*[?]{1}[^\s]*ll=[-]?[0-9]{1,3}\.?[0-9]{0,8},[-]?[0-9]{1,3}\.?[0-9]{0,8}[^\s]*/);

  if(maplink == null){
    alert('Podany link nie zawiera współrzędnych lub podane są one w nieprawidłowej formie.\nProszę sprawdzić czy w we wklejonym linku jest fragment, który wygląda mniej więcej tak:\nll=54.977614,16.171875 ');
  } else {
    if(maplink != null){
      var tmplatlon = maplink[0].match(/ll=[-]?[0-9]{1,3}\.?[0-9]{0,8},[-]?[0-9]{1,3}\.?[0-9]{0,8}/);
      var latlon = tmplatlon[0].match(/([-]?[0-9]{1,3}\.?[0-9]{0,8}),([-]?[0-9]{1,3}\.?[0-9]{0,8})/);
      var lat = latlon[1];
      var lon = latlon[2];

      var z = maplink[0].match(/z=([0-9]{1,2})/);

      if(z == null){
        spn = maplink[0].match(/&spn=[0-9]{1,3}\.?[0-9]{0,8},[0-9]{1,3}\.?[0-9]{0,8}/);
        zoom = getY(spn[0]);
        var myzoom = getZoomLevel(zoom, G_HYBRID_MAP);

        createMarker(new GLatLng(lat, lon));
        map.setCenter(new GLatLng(lat, lon), myzoom);
      }else{
        myzoom = parseInt(z[1]);
        createMarker(new GLatLng(lat, lon));
        map.setCenter(new GLatLng(lat, lon), myzoom);
      }
    }
  }
}

function googleMapSearch() {
  var search = document.forms['formAddMap'].elements['search'].value;

  geo.getLocations(search, function (result){
    if (result.Status.code == G_GEO_SUCCESS) {
      for (var i=0; i<result.Placemark.length; i++) {
        var p = result.Placemark[i].Point.coordinates;
        createMarker(new GLatLng(p[1],p[0]));
      }
      var p = result.Placemark[0].Point.coordinates;
      map.setCenter(new GLatLng(p[1],p[0]),14);
    } else {
      var reason="Code "+result.Status.code;
      if (reasons[result.Status.code]) {
        reason = reasons[result.Status.code]
      } 
      alert('Could not find "'+search+ '" '+reason);
    }
  });
}
