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