<div id='wrap_map_62f86ef2aac7f' class='ultimate-map-wrapper ult-adjust-bottom-margin ' style=' height:300px;'><div id='map_62f86ef2aac7f' 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_62f86ef2aac7f = null;
			var coordinate_map_62f86ef2aac7f;
			var isDraggable = $(document).width() > 641 ? true : true;
			try
			{
				var map_map_62f86ef2aac7f = null;
				var coordinate_map_62f86ef2aac7f;
				coordinate_map_62f86ef2aac7f=new google.maps.LatLng(54.46122, 11.06691);
				var mapOptions=
				{
					zoom: 13,
					center: coordinate_map_62f86ef2aac7f,
					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_62f86ef2aac7f = new google.maps.Map(document.getElementById('map_62f86ef2aac7f'),mapOptions);
						var x = 'infowindow_open_value';
						var marker_map_62f86ef2aac7f = new google.maps.Marker({
						position: new google.maps.LatLng(54.46122, 11.06691),
						animation:  google.maps.Animation.DROP,
						map: map_map_62f86ef2aac7f,
						icon: ''
					});	google.maps.event.addListener(marker_map_62f86ef2aac7f, 'click', toggleBounce);}
			catch(e){};
			jQuery(document).ready(function($){
				google.maps.event.trigger(map_map_62f86ef2aac7f, 'resize');
				$(window).resize(function(){
					google.maps.event.trigger(map_map_62f86ef2aac7f, 'resize');
					if(map_map_62f86ef2aac7f!=null)
						map_map_62f86ef2aac7f.setCenter(coordinate_map_62f86ef2aac7f);
				});
				$('.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_62f86ef2aac7f).parents('.ult_exp_section'))
					{
						setTimeout(function(){
							$(window).trigger('resize');
						},200);
					}
				});
				$(document).on('onUVCModalPopupOpen', function(){
					if($(map_map_62f86ef2aac7f).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_62f86ef2aac7f.getAnimation() != null) {
				marker_map_62f86ef2aac7f.setAnimation(null);
			  } else {
				marker_map_62f86ef2aac7f.setAnimation(google.maps.Animation.BOUNCE);
			  }
			}
			})(jQuery);
			</script>