
function checkBounds() { 
    if (allowedBounds.contains(map.getCenter())) {
        return;
    }

    var c = map.getCenter();
    var x = c.lng();
    var y = c.lat();
    var maxX = allowedBounds.getNorthEast().lng();
    var maxY = allowedBounds.getNorthEast().lat();
    var minX = allowedBounds.getSouthWest().lng();
    var minY = allowedBounds.getSouthWest().lat();

    if (x < minX) {x = minX;}
    if (x > maxX) {x = maxX;}
    if (y < minY) {y = minY;}
    if (y > maxY) {y = maxY;}

    map.setCenter(new GLatLng(y, x));
}

/* --- google maps api loading --- */

var google_maps_api_initialized = false;
var google_maps_api_initializing = false;
var google_maps_api_params = [];
var google_maps_api_callbacks = [];

function initialize_google_maps_api(callback, callback_params)
{
	if (google_maps_api_initialized) {
		callback.apply(this, callback_params);
		return;
	}
	
	google_maps_api_params[google_maps_api_params.length] = callback_params;
	google_maps_api_callbacks[google_maps_api_callbacks.length] = callback;
	
	if (!google_maps_api_initializing) {
		google.load("maps", "2",{"other_params":"hl=nl", "callback": "initialize_google_maps_api_callback"});
		google_maps_api_initializing = true;
	}
}

function initialize_google_maps_api_callback()
{
	google_maps_api_initialized = true;
	
	for(i=0,l=google_maps_api_callbacks.length;i<l;i++) {
		google_maps_api_callbacks[i].apply(this, google_maps_api_params[i]);
	}
}

/* --- END google maps api loading --- */

function initialize_hmnq_google_maps(siteUrl,divID,largeMap,hideMap,zoom) 
{
	site_url = siteUrl;
	initialize_google_maps_api(_initialize_hmnq_google_maps, [siteUrl,divID,largeMap,hideMap,zoom]);
}

function _initialize_hmnq_google_maps(siteUrl,divID,largeMap,hideMap,zoom) 
{
	if (GBrowserIsCompatible()) {
		var zoomLevel = 13;
		
		// Locatie bepalen
		var clientLocation = google.loader.ClientLocation;
		if (clientLocation && clientLocation.latitude && clientLocation.longitude) {
			var clientLatitude = clientLocation.latitude;
			var clientLongitude = clientLocation.longitude;
		}
		else {
			var zoomLevel = 7;
			var clientLatitude = 52.335339;
			var clientLongitude = 5.515137;
		}
		
		// Map laden
		map = new google.maps.Map2(document.getElementById(divID));
		geocoder = new GClientGeocoder();
		
		// Bounds for The Netherlands
		allowedBounds = new GLatLngBounds(new GLatLng(50.46449795300867, 3.31787109375), new GLatLng(53.79416183737104, 7.239990234374999));
		map.setCenter(new GLatLng(clientLatitude, clientLongitude), zoomLevel);
		if (largeMap == 'true') {
			map.addControl(new GLargeMapControl3D());
			map.addControl(new GScaleControl());
		}
		else{
			map.addControl(new GSmallZoomControl3D());
		}
		
		updatePosition();

		if(map.isLoaded() && hideMap == 'true') {
			$("#"+divID).css("display","none");
		}
	}
}

function updatePosition() {
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var lngSpan = northEast.lng() - southWest.lng();
	var latSpan = northEast.lat() - southWest.lat();
}

function googleMaps2rd (southWest, northEast, extraParams) {
	returnVal = "";
	returnRdVal = "";
	
	$.ajax({type: "GET", url: site_url+"ajax/google_maps/lat/"+southWest.lat()+"/long/"+southWest.lng()+extraParams, async: false, success: 
		function(data){
			returnRdVal = returnRdVal + data;
			
			$.ajax({type: "GET", url: site_url+"ajax/google_maps/lat/"+northEast.lat()+"/long/"+northEast.lng()+extraParams, async: false, success: 
				function(data2){
					returnRdVal = returnRdVal + "-" + data2;
				}
			});
		}
	});
	return returnRdVal;
}

function googleMaps2rdJSON (southWest, northEast, extraParams, callback) {
	returnVal = "";
	returnRdVal = "";
	
	url = site_url+"ajax/google_maps/";
	url+= "lat/"+southWest.lat()+"/long/"+southWest.lng();
	url+= extraParams + "?x=1";
	
	$.ajax({type: "GET", dataType: 'jsonp', url: url, success: 
		function(data){
			returnRdVal1 = returnRdVal + data.coords;
			
			url = site_url+"ajax/google_maps/";
			url+= "lat/"+northEast.lat()+"/long/"+northEast.lng();
			url+= extraParams + "?x=1";
			
			$.ajax({type: "GET", dataType: 'jsonp', url: url, success: 
				function(data2){
					returnRdVal = returnRdVal1 + "-" + data2.coords;
					callback(returnRdVal);
				}
			});
		}
	});
}

function loadSidebarRisks(append_to_div_selector, bounds, zoom)
{
	$(append_to_div_selector).append('<img id="loading_sidebarrisks" src="'+theme_url+'img/loadingAnimation.gif" />');
	
	$.ajax({
		url: site_url + "ajax/risk_sidebar?bounds="+bounds+"&zoom="+zoom,
		type: "GET", 
		dataType: "jsonp",
		success: function(data){
			if (data.html != '') {
				
				$(append_to_div_selector).append(data.html);
				$('ul.accordion').accordion({ active: ".selected", autoHeight: false, header: ".opener", collapsible: true, event: "click", fillSpace: false });
				$('#loading_sidebarrisks').fadeOut();
				$('#loading_sidebarrisks').remove();
				$('ul.accordion').fadeIn();
			}
			else {
				$('#loading_sidebarrisks').fadeOut();
				$('#loading_sidebarrisks').remove();
			}
		},
		error : function() { alert("error"); }
	});

}

function updateRiskButton(buttonId) {
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	
	if (allowedBounds.contains(map.getCenter())) {
		$("p.error_"+buttonId).fadeOut();
		googleMaps2rdJSON(southWest,northEast,"", function(rdCoordinates) {
			zoomLevel = map.getBoundsZoomLevel(bounds);
			
			riskMapUrl = $("a#" + buttonId).attr("href");
			if (riskMapUrl.indexOf("?") > -1) {
				riskMapUrl = riskMapUrl.substring(0, riskMapUrl.indexOf("?"));
			}
			
			oldVal = riskMapUrl;
			newVal = oldVal + "?rd="+rdCoordinates+"&zoom="+zoomLevel;
			document.location = newVal;
		});
	}
	else {
		$("p.error_"+buttonId).html(translate('risicokaart_werkt_alleen_binnen_nederland'));
		$("p.error_"+buttonId).fadeIn();
		
		return false;
	}
}

function showAddressOnMap(inputId) {
	
	address = $("input#" + inputId).val();

	if(validatePostalCode(address)) {
		if(address.length > 6) {
			address = address.split(' ').join('');
		}
	}
	address = address + ' Nederland';
	geocoder.getLatLng(
		address,
		function(point) {
			if (!point) {
				$("p.error_"+inputId).html(translate("location_x_not_found", address));
				$("p.error_"+inputId).fadeIn();
			} else {
				$("p.error_"+inputId).fadeOut();
				map.clearOverlays();
				map.setCenter(point, 13);
				var marker = new GMarker(point);
				map.addOverlay(marker);
			}
		}
	);
}

/* riskmap functions */
function fetch_riskmap(imgId) {
	// Todo: add some kind of logging to check how long it takes to load the image
	$("img#"+imgId).load(function(){
		$("#loading_riskmap").css("display","none");
		$("img#"+imgId).fadeIn();
		check_riskmapImg (imgId);
	});
	
	if($("img#"+imgId)[0].complete){
		$("#loading_riskmap").css("display","none");
		$("img#"+imgId).fadeIn();
		check_riskmapImg (imgId);
	}
	
	//$(document).ready( function() {
		//Needed to make it work in IE
		//check_riskmapImg (imgId);
	//});
}

function check_riskmapImg (imgId) {
	img = $("img#"+imgId);

	var width = img.width();
	var height = img.height();
	if (height < 400) {
		//alert(width+" - " +height);
		$("img#"+imgId).css("display","none");
		$("#loading_riskmap").text(translate('kaart_kan_niet_worden_geladen'));
		$("#loading_riskmap").css("color","#FF6633");
		$("#loading_riskmap").css("display","block");
	}
}

/* factsheet functions */
function initialize_factsheet_from_input(button_id,input_id,download_url) 
{
	initialize_google_maps_api(_initialize_factsheet_from_input, [button_id,input_id,download_url]);
}

function _initialize_factsheet_from_input(button_id,input_id,download_url)
{
		if (GBrowserIsCompatible()) {
		var zoomLevel = 13;
		
		// Locatie bepalen
		var clientLocation = google.loader.ClientLocation;
		if (clientLocation && clientLocation.latitude && clientLocation.longitude) {
			var clientLatitude = clientLocation.latitude;
			var clientLongitude = clientLocation.longitude;
		}
		else {
			var zoomLevel = 7;
			var clientLatitude = 52.335339;
			var clientLongitude = 5.515137;
		}
		
		// Map laden
		map_fact = new google.maps.Map2(document.getElementById("hidden_map_"+button_id));
		geocoder = new GClientGeocoder();
		
		// Bounds for The Netherlands
		allowedBounds = new GLatLngBounds(new GLatLng(50.46449795300867, 3.31787109375), new GLatLng(53.79416183737104, 7.239990234374999));
		
		map_fact.setCenter(new GLatLng(clientLatitude, clientLongitude), zoomLevel);

		map_fact.addControl(new GLargeMapControl3D());
		map_fact.addControl(new GScaleControl());
		
		updatePosition();
	}
	
	$("#hidden_map_"+button_id).css("visibility","hidden");//275
	$("#hidden_map_"+button_id).css("margin-bottom","-275px");//275
}

// Update the hidden google maps en update download link with updateFactsheetDownloadButton()
function showFactsheetAddressOnMap(inputId,buttonId,downloadUrl) {
	address = $("input#" + inputId).val();

	if(address != '' && validatePostalCode(address)) {
	
		if(validatePostalCode(address)) {
			if(address.length > 6) {
				address = address.split(' ').join('');
			} 
		}
		address = address + ' Nederland';
		geocoder.getLatLng(
			address,
			function(point) {
				if (!point) {
					$("p.error_factsheet_postal").html(translate("location_x_not_found", address));
					$("p.error_factsheet_postal").fadeIn();
				} else {
					map_fact.clearOverlays();
					map_fact.setCenter(point, 13);
					var marker = new GMarker(point);
					map_fact.addOverlay(marker);
					if (updateFactsheetDownloadButton(buttonId,downloadUrl)) {
						window.open($("a#" + buttonId).attr("href"));
					}
				}
			}
		);
		return true;
	} else {
		$("p.error_factsheet_postal").html(translate("vul_geldig_postcode_in"));
		$("p.error_factsheet_postal").fadeIn();			
		return false;
	}
}

// Updating the download button with the correct region
function updateFactsheetDownloadButton(buttonId,downloadUrl) {
	var bounds = map_fact.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	
	if (allowedBounds.contains(map_fact.getCenter())) {
		$("p.error_factsheet_postal").fadeOut();
		rdCoordinates = googleMaps2rd(southWest,northEast,"/roundnumbers/true");
		newVal = downloadUrl+rdCoordinates.replace( new RegExp("-", 'g'),",");
		$("a#" + buttonId).attr("href",newVal);
		_gaq.push(['_trackPageview', newVal]);
		return true;
	}
	else {
		$("p.error_factsheet_postal").html(translate('risicokaart_werkt_alleen_binnen_nederland'));
		$("p.error_factsheet_postal").fadeIn();
		return false;
	}
}

// Update the download button with the region given in the URL
function initialize_factsheet(button_id,region,download_url,risk) {
	if(risk != '') {
		$("#"+button_id).attr("href",download_url+risk);
	} else if (region != "") {
		$("#"+button_id).attr("href",download_url+region);
	}
}

//Send the factsheet e-mail form
function send_factsheet_homepage_form() {
	errorMessage = "";
	errorMessage = errorMessage + "";
	
	if ($("input#factsheet_postal").val() != undefined) {
		if ($("input#factsheet_postal").val() == "") {
			errorMessage = errorMessage + translate('geen_postcode_ingevuld') + "<br/>";
		}
		if ($("input#factsheet_postal").val() != "" && !isValidPostalCode($("input#factsheet_postal").val())) {
			errorMessage = errorMessage + translate('vul_postcode_in') + "<br/>";
		}
	}
	if ($("input#factsheet_download_email").val() == "") {
		errorMessage = errorMessage + translate('geen_email_ingevuld') + "<br/>";
	}
	if ($("input#factsheet_download_email").val() != "" && !isValidEmailAddress($("input#factsheet_download_email").val())) {
		errorMessage = errorMessage + translate('geen_geldig_email_ingevuld') + "<br/>";
	}
	if (!$("#chk-1").attr("checked")) {
		errorMessage = errorMessage + translate('x_niet_aangevinkt', translate('keep_me_informed_about_riskinformation')) + "<br/>";
	}
	
	if (errorMessage != "") {
		// Don't send form, show errors.
		hideDiv('factsheet_email_status');
		$("p.error_factsheet_postal").html(errorMessage);
		$("p.error_factsheet_postal").fadeIn();
	}
	else {
		
		var postal = $("input#factsheet_postal").val();
		var email = $("input#factsheet_download_email").val();
		var risks = $('div#risks_onmap').html();
		var keepinformed = 1;

		if(postal != '' && validatePostalCode(postal)) {
		
			if(validatePostalCode(postal)) {
				if(postal.length > 6) {
					postal = postal.split(' ').join('');
				} 
			}
			postal = postal + ' Nederland';
			
			geocoder.getLatLng(
					postal,
				function(point) {
					if (!point) {
						//alert("De locatie '"+address + "' kan niet gevonden worden.");
						$("p.error_factsheet_postal").html(translate('location_x_not_found', postal));
						$("p.error_factsheet_postal").fadeIn();
					} else {
						map_fact.clearOverlays();
						map_fact.setCenter(point, 13);
						var marker = new GMarker(point);
						map_fact.addOverlay(marker);
					}
				}
			);
		} else {
			$("p.error_factsheet_postal").html(translate('vul_geldig_postcode_in'));
			$("p.error_factsheet_postal").fadeIn();			

		}

		// haal de bounds op vanaf de verborgen kaart
		var bounds = map_fact.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		
		if (allowedBounds.contains(map_fact.getCenter())) {
			$("p.error_factsheet_postal").fadeOut();
			rdCoordinates = googleMaps2rd(southWest,northEast,"/roundnumbers/true");
			nb = rdCoordinates;
		}
		else {
			$("p.error_factsheet_postal").html(translate('risicokaart_werkt_alleen_binnen_nederland'));
			$("p.error_factsheet_postal").fadeIn();
		}
		
		// Send form
		$.ajax({type: "POST", url: site_url+"ajax/abonnement", data: {act: "homepage", email: email, bounds: nb, postal: postal}, async: false, success: 
			function(data){
				message = data;
			}
		});
		
		$("p.error_factsheet_postal").fadeOut( function() {
			// Show sent popup
			$("div#factsheet_email_status").html(message);
			$("div#factsheet_email_status").fadeIn('fast');				
		});
	}
}

function showAbonnementAddressOnMap(inputId) {
	address = $("input#" + inputId).val();
		
	if(validatePostalCode(address)) {
		if(address.length > 6) {
			address = address.split(' ').join('');
		}
	}
	address = address + ' Nederland';

	geocoder = new GClientGeocoder();
	geocoder.getLatLng(
		address,
		function(point) {
			if (!point) {
				$("p.error_factsheet_postal").html(translate('location_x_not_found', address));
				$("p.error_factsheet_postal").fadeIn();
			} else {
				map_fact.clearOverlays();
				map_fact.setCenter(point, 13);
				
				var marker = new GMarker(point);
				map_fact.addOverlay(marker);
				
				var map_bounds = map_fact.getBounds();
				var southWest = map_bounds.getSouthWest();
				var northEast = map_bounds.getNorthEast();
				
				nb = getBounds(southWest.lat(),southWest.lng(), northEast.lat(), northEast.lng());
				return nb;
			}
		}
	);
}


function getBounds(swlat, swlng, nelat, nelng) {
	
	bounds_str = '';
	$.ajax({type: "GET", url: site_url+"ajax/google_maps/lat/"+swlat+"/long/"+swlng+'/roundnumbers/true', async: false, success: 
		function(data){
		bounds_str = bounds_str + data;
			
			$.ajax({type: "GET", url: site_url+"ajax/google_maps/lat/"+nelat+"/long/"+nelng+'/roundnumbers/true', async: false, success: 
				function(data2){
				bounds_str = bounds_str + "," + data2;
				}
			});
		}
	});
	return bounds_str;
}



function send_abonnement_riskmap_form(bounds) {
	errorMessage = "";

	if ($("input#factsheet_download_email").val() == "") {
		errorMessage = errorMessage + translate('geen_email_ingevuld') + "<br/>";
	}
	if ($("input#factsheet_download_email").val() != "" && !isValidEmailAddress($("input#factsheet_download_email").val())) {
		errorMessage = errorMessage + translate('geen_geldig_email_ingevuld') + "<br/>";
	}
	if (!$("#chk-1").attr("checked")) {
		errorMessage = errorMessage + translate('x_niet_aangevinkt', translate('keep_me_informed_about_riskinformation')) + "<br/>";
	}
	
	if (errorMessage != "") {
		hideDiv('abonnement_status');
		// Don't send form, show errors.
		$("p.error_abonnement").html(errorMessage);
		$("p.error_abonnement").fadeIn();
	}
	else {
		
		var email = $("input#factsheet_download_email").val();
		var risks = $('div#risks').html();
		var keepinformed = 1;
		
		// Send form
		$.ajax({type: "POST", url: site_url+"ajax/abonnement", data: {act: "riskmap", email: email, bounds: bounds, risks: risks}, async: false, success: 
			function(data){
				message = data;
			}
		});
		
		$("p.error_abonnement").fadeOut( function() {
			// Show sent popup
			$("div#abonnement_status").html(message);
			$("div#abonnement_status").fadeIn('fast');

		});
	}
}


function send_abonnement_riskpage_form(risks) {
	errorMessage = "";
	
	if ($("input#factsheet_download_email").val() == "") {
		errorMessage = errorMessage + translate('geen_email_ingevuld') + "<br/>";
	}
	if ($("input#factsheet_download_email").val() != "" && !isValidEmailAddress($("input#factsheet_download_email").val())) {
		errorMessage = errorMessage + translate('geen_geldig_email_ingevuld') + "<br/>";
	}
	if (!$("#chk-1").attr("checked")) {
		errorMessage = errorMessage + translate('x_niet_aangevinkt', translate('keep_me_informed_about_riskinformation')) + "<br/>";
	}
	
	if (errorMessage != "") {
		// Don't send form, show errors.
		hideDiv('riskpage_status');
		$("p.error_riskpage").html(errorMessage);
		$("p.error_riskpage").fadeIn();
	}
	else {
		
		var email = $("input#factsheet_download_email").val();
		var keepinformed = 1;
		
		// Send form
		$.ajax({type: "POST", url: site_url+"ajax/abonnement", data: {act: "riskpage", email: email, risks: risks}, async: false, success: 
			function(data){
				message = data;
			}
		});
		
		$("p.error_riskpage").fadeOut( function() {
			// Show sent popup
			$("div#riskpage_status").html(message);
			$("div#riskpage_status").fadeIn('fast');
		});
	}
}


function hideDiv(div) {
	$("#"+div).fadeOut('fast');
}

function isValidEmailAddress(emailAddress) {
	var pattern = new RegExp(/^(("[\w-\s\+]+")|([\w-\+]+(?:\.[\w-\+]+)*)|("[\w-\s\+]+")([\w-\+]+(?:\.[\w-\+]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
	return pattern.test(emailAddress);
}

function isValidPostalCode(zipCode) {
	var pattern = new RegExp(/(^\d{4}\D{2}$)|(^\d{4} \D{2}$)/);
	return pattern.test(zipCode);
}

function validatePostalCode(str) {
	  return typeof str=='string'
	    ?str.match(/[1-9][0-9]{3} ?[a-zA-Z]{2}/)==str
	    :false;
}


