var mapInitialized = false;

function createIcon(pin) {
  try {_icons} catch (e) {_icons = {};};
  if (!_icons[pin]) {
    var icon = new GIcon();
    icon.image = "/images/pins/" + pin + ".png";
    icon.iconSize = new GSize(58, 83);
    icon.shadow = "/images/pins/shadow.png";
    icon.shadowSize = new GSize(58, 83);
    icon.iconAnchor = new GPoint(29, 69);
    icon.infoWindowAnchor = new GPoint(28, 14);
    icon.transparent = "/images/pins/mask.png";
    icon.imageMap = [42,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,43,31,43,32,43,33,43,34,43,35,43,36,43,37,43,38,43,39,43,40,43,41,42,42,39,43,38,44,38,45,37,46,37,47,37,48,36,49,36,50,35,51,35,52,35,53,34,54,34,55,34,56,33,57,33,58,32,59,32,60,32,61,31,62,31,63,30,64,30,65,30,66,29,67,29,68,28,69,28,69,28,68,28,67,27,66,27,65,26,64,26,63,26,62,25,61,25,60,25,59,24,58,24,57,23,56,23,55,23,54,22,53,22,52,21,51,21,50,21,49,20,48,20,47,19,46,19,45,19,44,18,43,15,42,14,41,14,40,14,39,14,38,14,37,14,36,14,35,14,34,14,33,14,32,14,31,14,30,14,29,14,28,14,27,14,26,14,25,14,24,14,23,14,22,14,21,14,20,14,19,14,18,14,17,14,16,14,15,14,14,15,13];
    _icons[pin] = icon;
  }
  return _icons[pin];
}

function initMap(mode) {
	if (mapInitialized) {
		return;
	}

	
  if (!GBrowserIsCompatible()) {
    return;
  }

  if (!$('map_canvas') || !$('googlemap_longitude') || !$('googlemap_latitude') || !$('googlemap_zoom')) {
    return;
  }

	mapInitialized = true;
  var field = $('map_canvas');

  field.map = new GMap2(field);
  field.map.addMapType(G_PHYSICAL_MAP);
  field.map.setMapType(G_PHYSICAL_MAP);
  field.geocoder = new GClientGeocoder();

  console.log(parseFloat($('googlemap_latitude').value));
  var center = new GLatLng(parseFloat($('googlemap_latitude').value), parseFloat($('googlemap_longitude').value));
  if (mode == 'small') {
    field.map.addControl(new GHierarchicalMapTypeControl());
    field.map.addControl(new GSmallMapControl());
  }
  else
  {
    field.map.addControl(new GMapTypeControl());
    field.map.addControl(new GLargeMapControl());
  }

  if (mode == 'edit') {
    field.marker = new GMarker(center, {draggable:true, autoPan:true});
    GEvent.addListener(field.marker, 'dragend', dragMapMarker);
    GEvent.addListener(field.map, 'click', clickMap);
    field.map.addOverlay(field.marker);
    GEvent.addListener(field.map, 'zoomend', zoomMap);
  }
  else {
    if ($('googlemap_pin') && $('googlemap_pin').value) {
      field.marker = new GMarker(center, {icon: createIcon($('googlemap_pin').value)});
    } else {
      field.marker = new GMarker(center);
    }
    field.map.addOverlay(field.marker);
  }

  field.map.setCenter(center, parseInt($('googlemap_zoom').value));
  field.map.enableScrollWheelZoom();
	
  GEvent.addListener(field.marker, 'click', clickMarker);

  if (mode != 'edit' && mode != 'small') {
    clickMarker(center);
  }
}

function clickMap(overlay, loc, overlayLoc) {
  if (!overlay) {
    $('map_canvas').marker.setLatLng(loc);
    dragMapMarker(loc);
  }
}

function dragMapMarker(loc) {
  $('googlemap_longitude').value = loc.lng();
  $('googlemap_latitude').value = loc.lat();

  $('map_canvas').geocoder.getLocations(loc, showAddress);
}

function zoomMap(oldLevel, newLevel) {
  $('googlemap_zoom').value = newLevel;
}

function showAddress(response) {
  if (!response || response.Status.code != 200) {
    $('googlemap_location_str').value = '';
    return;
  }

  $('googlemap_location_str').value = response.Placemark[0].address;
}

function clickMarker(loc) {
  if (!$('googlemap_location_str').value) {
    return;
  }

  var locationParts = $('googlemap_location_str').value.split(', ');
  $('map_canvas').map.openInfoWindowHtml(loc, '<div style="color:#000;">'+ locationParts.join('<br />') +'</span>');
}

function findMapCoordinates() {
  if (!$('googlemap_location_str').value) {
    return;
  }

  $('map_canvas').geocoder.getLocations($('googlemap_location_str').value, setLocation);
}

function setLocation(response) {
  if (!response || response.Status.code != 200) {
    return;
  }

  $('googlemap_location_str').value = response.Placemark[0].address;

  var loc = new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]);
  $('map_canvas').map.setZoom(8+response.Placemark[0].AddressDetails.Accuracy);
  $('map_canvas').marker.setLatLng(loc);
  $('map_canvas').map.setCenter(loc);
  $('googlemap_longitude').value = response.Placemark[0].Point.coordinates[0];
  $('googlemap_latitude').value = response.Placemark[0].Point.coordinates[1];
  clickMarker(loc);
}

function copyAddressData() {
  var parts = new Array();
  var addressFields = new Array('profile_city', 'profile_country');
  for (var i = 0; i < addressFields.length; i++) {
    field = addressFields[i];
    if (!$(field) || !$(field).value) {
      continue;
    }

    parts[parts.length] = $(field).value;
  }
  $('googlemap_location_str').value = (parts.length > 1) ? parts.join(', ') : '';
  findMapCoordinates();
}

function centerMap() {
  if (!$('map_canvas').marker) {
    return;
  }

  $('map_canvas').map.setCenter($('map_canvas').marker.getLatLng());
}

// function for suppressing form submission
function noEnter(e) {
  var characterCode

  if(e && e.which) {
    e = e;
    characterCode = e.which;
  }
  else {
    e = event;
    characterCode = e.keyCode;
  }

  if(characterCode == 13) {
    findMapCoordinates();
    return false;
  }
  else {
    return true;
  }
}

