var geocoder;
var map;
var image = '/img/map-marker.png';
var nlBounds =  new google.maps.LatLngBounds(new google.maps.LatLng(51.2472913,3.2423158),new google.maps.LatLng(53.0007240,7.3402162))
var winkelsList = {};
var ready = false;

$(function() {

	// controls
	var btnZoek = $("#button-zoekwinkel");
	var tbPostcode = $("#strPostcode");
	var selStraal = $("#strStraal");
	var tbStad = $("#strMapscity");

	initializeMaps();
	
	$("#sluit-popup").live('click', function(e) {
		e.preventDefault();
		removePopup();
	})
	
	$("form[name='frmWinkelsZoeken']").submit(function(){
		return false;
	});
	
	$("#button-zoekwinkel").click(function(e) {
		
		e.preventDefault();
		removePopup();
		
		var postcode = tbPostcode.val();
		var stad = tbStad.val().toLowerCase();
		
		postcode = postcode.replace(/ /g, '');
		
		if (geocoder) {
			
			if(postcode.length > 0) {
			
				location.hash = "#postcode=" + postcode + "&straal=" + selStraal.val();
				zoekOpPostcode(postcode);
				
			} else if (stad.length > 0) {
				
				location.hash = "#plaats=" + stad;
				zoekOpPlaats(stad);
				
			}
		}
	});
	
	$("#winkel-locatie-filter li a").click(function(e) {
			e.preventDefault();
			var stad = $(this).attr('title');
			location.hash = "#plaats=" + stad;
			zoekOpPlaats(stad);

		});
	
	function pollHash() {
		
		var hash = location.hash;
		if(hash.length > 0){
		
			if(hash.indexOf("postcode") > 0){
				
				var chunks = hash.split("&");
				var postcode = chunks[0].split('=')[1];
				tbPostcode.val(postcode);
				selStraal.val(chunks[1].split('=')[1]);
				zoekOpPostcode(postcode)
				
			}
			else if(hash.indexOf("plaats") > 0){
			
				var plaats = hash.split('=')[1];
				tbStad.val(plaats);
				zoekOpPlaats(plaats);
				
			}
			
		}
	}

	setTimeout(pollHash, 400);

});

function showLoader() {
	$("#map_loader").show();
}

function hideLoader() {
	$("#map_loader").hide();
}

function initializeMaps() {

	// show loader
	showLoader();
	
	geocoder = new google.maps.Geocoder();
	var myOptions = {
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  map.fitBounds(nlBounds);
	fillWinkelList();
	
	//Events
	google.maps.event.addListener(map, 'bounds_changed', function() {
    removePopup();
  });
	google.maps.event.addListener(map, 'dragstart', function() {
    removePopup();
  });
}

function fillWinkelList() {
	$.ajax({
		type: "POST",
		url: "/Handlers/maps-handler.asp",
		data: "strActie=getWinkels",
		success: function(msg){
			var winkels = eval(msg);
			var winkel;
			for (var i = 0; i < winkels.length; i++) {
				
				winkel = winkels[i];
				winkelsList[i] = winkel;
				placeMarker(winkel);
			}
			hideLoader();
			ready = true;
		}
	});
}


function placeMarker(winkel) {
  var myLatLng = new google.maps.LatLng(winkel.Latitude, winkel.Longitude);
  var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      icon: image,
			title: winkel.Naam
  });
	winkel.marker = marker;
	marker.winkel = winkel;
	//Handlers voor popup
	google.maps.event.addListener(marker, 'click', showPopup);
}


//Event handlers
function showPopup(event) {
	 //Remove old popups
	 removePopup();
	 //Nieuw info toevoegen
	 winkelInfo(this.winkel);
}

function winkelInfo(winkel) {

	var markerPosition = winkel.marker.getPosition();
	var infoPopup = new WinkelOverlay({ 
		map: map,
		winkel: winkel
	});
									
}

function removePopup() {
	$(".winkel-popup").remove();
}

function zoekOpPlaats(stad) {
	var bounds = new google.maps.LatLngBounds();
	var changed = false;
	var matches = 0;
	if(stad.length > 3) {
		$.ajax({
			type: "POST",
			url: "/Handlers/maps-handler.asp",
			data: {strActie: "zoekWinkel", strPlaats: stad} ,
			success: function(msg){
				var winkels = eval(msg);
				if(winkels != null) {
					var winkel;
					for (var i = 0; i < winkels.length; i++) {
						bounds.extend(new google.maps.LatLng(winkels[i].Latitude,winkels[i].Longitude));
						changed = true;
						matches++;
					}
				}
				
				if(changed) {
					map.fitBounds(bounds);
					if(matches == 1) {
						map.setZoom(16);
					}
				} else {
					showErrorNotFound(false);
				}
				
			}
		});
	}
	else {
		alert("Voer minstens 3 karakters in.");
	}
}

function zoekOpPostcode(postcode) {
	
	if ( /^\s?\d{4}\s?([a-zA-Z]{2})\s?$/.test(postcode) == false){
		alert("De ingevoerde postcode is geen geldige nederlandse postcode");
		return;	
	}
	
	postcode = postcode.replace(/ /g, '').toUpperCase();
	
	if(geocoder){
	
	geocoder.geocode( { 'address': postcode}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
		
			var huidigPostcodePoint = results[0].geometry.location;
			var dichtsBijzijndeWinkel = null;
			var dichtsBijzijndeWinkelPoint = null;
			var kortsteAfstand = 999999;
			var straal = $("#strStraal").val();
				
			for (var i in winkelsList) {
				
				var winkelPoint = new google.maps.LatLng(winkelsList[i].Latitude,winkelsList[i].Longitude);
				var afstand = huidigPostcodePoint.kmTo(winkelPoint);
				
				if ( (afstand < kortsteAfstand && Math.round(afstand) <= straal) ) {
					kortsteAfstand = afstand;
					dichtsBijzijndeWinkel = winkelsList[i];
					dichtsBijzijndeWinkelPoint = winkelPoint;
				}
			}

			if (dichtsBijzijndeWinkel != null && dichtsBijzijndeWinkelPoint != null) {
				var KM = 0.008993;
				var straalPoint = straal * KM / 2;
				var southwestPoint = new google.maps.LatLng(dichtsBijzijndeWinkelPoint.lat() - straalPoint, dichtsBijzijndeWinkelPoint.lng() - straalPoint);
				var northeastPoint = new google.maps.LatLng(dichtsBijzijndeWinkelPoint.lat() + straalPoint, dichtsBijzijndeWinkelPoint.lng() + straalPoint);
				var bounds = new google.maps.LatLngBounds(southwestPoint, northeastPoint);
				map.fitBounds(bounds);
			} else  {
				showErrorNotFound(true);
			}
					
		}
	});
	
	}
}

function showErrorNotFound(isPostcode) {
	if(isPostcode) {
		alert("Er is helaas geen AKO bij je in de buurt. Pas de straal aan om het zoekgebied uit te breiden. Of koop je boeken online, dan worden ze gratis thuisbezorgd.");
	} else {
		alert("Er is helaas geen AKO bij je in de buurt. Of koop je boeken online, dan worden ze gratis thuisbezorgd.");
	}
}

/**
 * Store overlay
 */
function WinkelOverlay(options) {
	this.setValues(options);  
	
	var tntbalie = '';
	var afhaalbalie = '';
	var opzondagopen = '';

	if (options.winkel.TNTBalie) {
		tntbalie = "<li>TNT balie</li>";	
	}
	
	if (options.winkel.AfhaalbalieOnlineBestellingen) {
		afhaalbalie = "<li>Afhaalbalie online bestellingen</li>";
	}
	
	if (options.winkel.OpZondagOpen) {
		opzondagopen = "<li>Op zondag open</li>"
	}
	
	var popup = $("<div></div>")
		.addClass("winkel-popup")
		.attr("id", "winkel_" + options.winkel.WinkelID)
		.append('<div class="winkel-popup-sluit"><a href="#" id="sluit-popup"><span>Sluit popup</span></a></div>' +
							'<div class="winkel-popup-content-container">' +	
							'<div class="winkel-popup-content">' +	
							'<h3>' + options.winkel.Naam + '</h3>' +
							'<h4>Adres</h4>' +
							'<p>' + options.winkel.Straat + ' ' + options.winkel.Huisnummer + '</p>' +
							'<p>' + options.winkel.Postcode + ' ' + options.winkel.Plaats + '</p>' +
							'<h4>Openingstijden</h4>' + 
							'<p>' + options.winkel.Openingstijden + '</p>' +
							'<h4>In deze winkel</h4>' + 
							'<ul>' +
								tntbalie +
								afhaalbalie + 
								opzondagopen +
							'</ul>' +
							'<p><a href="'+options.winkel.Url+'" title="meer informatie over '+options.winkel.Naam+'">Meer informatie</a></p>' +
						'</div></div><div class="winkel-popup-bottom"></div>');
	
	this.div_ = popup.get(0);
};

// WinkelOverlay is derived from google.maps.OverlayView
WinkelOverlay.prototype = new google.maps.OverlayView;

WinkelOverlay.prototype.onAdd = function() {
	var pane = this.getPanes().overlayLayer;
	$(pane).parents('#map_canvas').parent().append(this.div_);
}

WinkelOverlay.prototype.onRemove = function() {}

WinkelOverlay.prototype.draw = function() {

	var projection = this.getProjection();
	var position = projection.fromLatLngToContainerPixel(this.winkel.marker.getPosition());
	
	$(this.div_).css({
		left: position.x + 'px',
		top: position.y + 'px'
	}).show();
	
};


/**
 * distance from this LatLng to a given LatLng
 */
google.maps.LatLng.prototype.kmTo = function(a){
  var e = Math, ra = e.PI/180;
  var b = this.lat() * ra, c = a.lat() * ra, d = b - c;
  var g = this.lng() * ra - a.lng() * ra;
  var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d/2), 2) + e.cos(b) * e.cos(c) * e.pow(e.sin(g/2), 2)));
  return f * 6378.137; 
}


