(function () {
  var rs = rpcQuery('rpc.php?function=new-relation.getPoints');

  if ('OK' != rs[0]) {
    return;
  }

  var places = rs[1].split('\\c'),
      place  = rs[2].split('\\c'),
      points = [];

  for (var i = 0; i < places.length; i++) {
    var point = places[i].split('\\a');

    if (3 != point.length) {
      continue;
    }

    with ({lat: point[0], lng: point[1], link: point[2]}) {
      if (0 == lat.length * lng.length) {
        continue;
      }

      points.push({
        'lat': lat,
        'lng': lng,
        'link': link
      });
    }
  }

  EventDispatcher.connect('map.showRegion', function (placeInfo) {
    geocoder.getLocations(placeInfo.join(', '), function (locations) {
      if (undefined === locations.Placemark) {
        placeInfo.pop();

        if (0 != placeInfo.length) {
          EventDispatcher.notify('map.showRegion', placeInfo);
        }

        return;
      }

      with (locations.Placemark[0].ExtendedData.LatLonBox) {
        var bounds = new GLatLngBounds(new GLatLng(south, west), new GLatLng(north, east));

        map.setCenter(bounds.getCenter(), Math.min(11, map.getBoundsZoomLevel(bounds)));
      }
    });
  });

  var idMap = document.getElementById('map'),
      map   = new GMap2(idMap);

  map.setUIToDefault();
  map.disableScrollWheelZoom();
  map.setMapType(G_PHYSICAL_MAP);

  if (0 == points.length) {
    var geocoder = new GClientGeocoder();
    EventDispatcher.notify('map.showRegion', place);
  } else {
    var bounds = new GLatLngBounds();

    for (var i = 0; i < points.length; i++) {
      var point = new GLatLng(points[i].lat, points[i].lng),
          marker = new GMarker(point);

      (function () {
        var link = points[i].link;

        GEvent.addListener(marker, 'click', function () {
          top.location.href = link;
        });
      })();

      map.addOverlay(marker);
      bounds.extend(point);
    }

    map.setCenter(bounds.getCenter(), Math.min(11, map.getBoundsZoomLevel(bounds)));
  }

})();

