<div id='wrap_map_6007a6165a8bb' class='ultimate-map-wrapper ult-adjust-bottom-margin ' style=' height:300px;'><div id='map_6007a6165a8bb' data-map_override='0' class='ultimate_google_map wpb_content_element page_margin_top' style='width:100%;height:300px;'></div></div><script type='text/javascript'>
			(function($) {
  			'use strict';
			var map_map_6007a6165a8bb = null;
			var coordinate_map_6007a6165a8bb;
			var isDraggable = $(document).width() > 641 ? true : true;
			try
			{
				var map_map_6007a6165a8bb = null;
				var coordinate_map_6007a6165a8bb;
				coordinate_map_6007a6165a8bb=new google.maps.LatLng(54.46122, 11.06691);
				var mapOptions=
				{
					zoom: 13,
					center: coordinate_map_6007a6165a8bb,
					scaleControl: true,
					streetViewControl: false,
					mapTypeControl: false,
					panControl: false,
					zoomControl: false,
					scrollwheel: true,
					draggable: isDraggable,
					zoomControlOptions: {
						position: google.maps.ControlPosition.RIGHT_BOTTOM
					},mapTypeId: google.maps.MapTypeId.ROADMAP,};var map_map_6007a6165a8bb = new google.maps.Map(document.getElementById('map_6007a6165a8bb'),mapOptions);
						var x = 'infowindow_open_value';
						var marker_map_6007a6165a8bb = new google.maps.Marker({
						position: new google.maps.LatLng(54.46122, 11.06691),
						animation:  google.maps.Animation.DROP,
						map: map_map_6007a6165a8bb,
						icon: ''
					});	google.maps.event.addListener(marker_map_6007a6165a8bb, 'click', toggleBounce);}
			catch(e){};
			jQuery(document).ready(function($){
				google.maps.event.trigger(map_map_6007a6165a8bb, 'resize');
				$(window).resize(function(){
					google.maps.event.trigger(map_map_6007a6165a8bb, 'resize');
					if(map_map_6007a6165a8bb!=null)
						map_map_6007a6165a8bb.setCenter(coordinate_map_6007a6165a8bb);
				});
				$('.ui-tabs').bind('tabsactivate', function(event, ui) {
				   if($(this).find('.ultimate-map-wrapper').length > 0)
					{
						setTimeout(function(){
							$(window).trigger('resize');
						},200);
					}
				});
				$('.ui-accordion').bind('accordionactivate', function(event, ui) {
				   if($(this).find('.ultimate-map-wrapper').length > 0)
					{
						setTimeout(function(){
							$(window).trigger('resize');
						},200);
					}
				});
				$(window).load(function(){
					setTimeout(function(){
						$(window).trigger('resize');
					},200);
				});
				$('.ult_exp_section').select(function(){
					if($(map_map_6007a6165a8bb).parents('.ult_exp_section'))
					{
						setTimeout(function(){
							$(window).trigger('resize');
						},200);
					}
				});
				$(document).on('onUVCModalPopupOpen', function(){
					if($(map_map_6007a6165a8bb).parents('.ult_modal-content'))
					{
						setTimeout(function(){
							$(window).trigger('resize');
						},200);
					}
				});
				$(document).on('click','.ult_tab_li',function(){
					$(window).trigger('resize');
					setTimeout(function(){
						$(window).trigger('resize');
					},200);
				});
			});
			function toggleBounce() {
			  if (marker_map_6007a6165a8bb.getAnimation() != null) {
				marker_map_6007a6165a8bb.setAnimation(null);
			  } else {
				marker_map_6007a6165a8bb.setAnimation(google.maps.Animation.BOUNCE);
			  }
			}
			})(jQuery);
			</script>