var map;
var geocoder;
var markersArray = [];
var infowindow;
 
(function(){
 
  google.maps.Map.prototype.markers = new Array();
    
  google.maps.Map.prototype.addMarker = function(marker) {
    this.markers[this.markers.length] = marker;
  };
    
  google.maps.Map.prototype.getMarkers = function() {
    return this.markers
  };
    
  google.maps.Map.prototype.clearMarkers = function() {
    if(infowindow) {
      infowindow.close();
    }
    
    for(var i=0; i<this.markers.length; i++){
      this.markers[i].set_map(null);
    }
  };
})();

function initialize(){
	geocoder = new google.maps.Geocoder();

	var latlng = new google.maps.LatLng(51, 10);
    var config = {
      zoom: 4,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
	  navigationControl: true,
	  navigationControlOptions:{
		  style: google.maps.NavigationControlStyle.SMALL
	  },
	  mapTypeControl: false
    };
	
    map = new google.maps.Map(document.getElementById("map"), config);
	
	$('form.storeSearch').submit(function(){
		var address = $('input.address').val();
		var radius = $('select.radius').val();
		searchLocation(address, radius);
		return false;
	});
}
	
	
function searchLocation(address, radius){
    if (geocoder) {
      geocoder.geocode( { 'address': address}, function(results, status) {
		  $('#results').empty();
		  deleteOverlays();
		  if (status == google.maps.GeocoderStatus.OK) {
			findStores(results[0].geometry.location, radius);
        }else if(status == google.maps.GeocoderStatus.ZERO_RESULTS) {
			var latlng = new google.maps.LatLng(51, 10);
			map.setCenter(latlng);
			map.setZoom(4);
			$('<b>Die von Ihnen gewählte Adresse konnte nicht aufgelöst werden. Bitte versuchen Sie eine andere Schreibweise.</b>').appendTo('#results');
		}
		 else {
			 var latlng = new google.maps.LatLng(51, 10);
			map.setCenter(latlng);
			map.setZoom(4);
			$('<b>Der Server antwortet nicht. Bitte versuchen Sie es später erneut.</b>').appendTo('#results');
        }
      });
    }
}

function findStores(position, radius){
	$.ajax({
		type: 'GET',
		url: 'api.php',
		dataType: 'json',
		data:{
			lat: position.lat(),
			lng: position.lng(),
			radius: radius
		},
		error: function(){
			var latlng = new google.maps.LatLng(51, 10);
			map.setCenter(latlng);
			map.setZoom(4);
			$('<b>Der Server antwortet nicht. Bitte versuchen Sie es später erneut.</b>').appendTo('#results');
		},
		success:function(result){
			var status = result.status.code;
			if(status==200){
			var bounds = new google.maps.LatLngBounds();
			$.each(result.items, function(i, item){
				var name = item.name;
				var address = item.address;
				var lat = item.lat;
				var lng = item.lng;
				var distance = parseFloat(item.distance);
				var position = new google.maps.LatLng(lat, lng);
				var marker = createMarker(position, name, address);
				marker.setMap(map);
				var entry = markerToList(marker, name, address, distance);
				$(entry).appendTo('#results');
				bounds.extend(position);
			});
			map.fitBounds(bounds);
			}else if(status==201){
				var latlng = new google.maps.LatLng(51, 10);
				map.setCenter(latlng);
				map.setZoom(4);
				$('<b>In der Nähe des von Ihnen gewählten Ort befinden sich keine Monari-Stores. Bitte versuchen Sie einen größeren Radius oder eine andere Adresse.</b>').appendTo('#results');
			}
		}
	});
}

function createMarker(latlng, name, address) {
    var marker = new google.maps.Marker({position: latlng, map: map});
    google.maps.event.addListener(marker, "click", function() {
      if (infowindow) infowindow.close();
      infowindow = new google.maps.InfoWindow({content: '<b>'+name+'</b><br />'+address});
      infowindow.open(map, marker);
    });
	markersArray.push(marker);
    return marker;
  }
	
function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
}
	
function markerToList(marker, name, address, distance){
	var div = document.createElement('div');
    var html = '<span class="entry"><b>'+name+'</b> ('+distance.toFixed(1)+' km) '+address+'</span>';
    div.innerHTML = html;
	google.maps.event.addDomListener(div, 'click', function(){
		google.maps.event.trigger(marker, 'click');
	});
	return div;
}
