var mapInitialized = false;

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.setMapType(G_HYBRID_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 {
    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;
  }
}
