
(function(){var d=null;function e(a){return function(b){this[a]=b}}function h(a){return function(){return this[a]}}var j;
    function k(a,b,c){this.extend(k,google.maps.OverlayView);this.c=a;this.a=[];this.f=[];this.ca=[53,56,66,78,90];this.j=[];this.A=!1;c=c||{};this.g=c.gridSize||60;this.l=c.minimumClusterSize||2;this.J=c.maxZoom||d;this.j=c.styles||[];this.X=c.imagePath||this.Q;this.W=c.imageExtension||this.P;this.O=!0;if(c.zoomOnClick!=void 0)this.O=c.zoomOnClick;this.r=!1;if(c.averageCenter!=void 0)this.r=c.averageCenter;l(this);this.setMap(a);this.K=this.c.getZoom();var f=this;google.maps.event.addListener(this.c,
        "zoom_changed",function(){var a=f.c.getZoom();if(f.K!=a)f.K=a,f.m()});google.maps.event.addListener(this.c,"idle",function(){f.i()});b&&b.length&&this.C(b,!1)}j=k.prototype;j.Q="https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m";j.P="png";j.extend=function(a,b){return function(a){for(var b in a.prototype)this.prototype[b]=a.prototype[b];return this}.apply(a,[b])};j.onAdd=function(){if(!this.A)this.A=!0,n(this)};j.draw=function(){};
    function l(a){if(!a.j.length)for(var b=0,c;c=a.ca[b];b++)a.j.push({url:a.X+(b+1)+"."+a.W,height:c,width:c})}j.S=function(){for(var a=this.o(),b=new google.maps.LatLngBounds,c=0,f;f=a[c];c++)b.extend(f.getPosition());this.c.fitBounds(b)};j.z=h("j");j.o=h("a");j.V=function(){return this.a.length};j.ba=e("J");j.I=h("J");j.G=function(a,b){for(var c=0,f=a.length,g=f;g!==0;)g=parseInt(g/10,10),c++;c=Math.min(c,b);return{text:f,index:c}};j.$=e("G");j.H=h("G");
    j.C=function(a,b){for(var c=0,f;f=a[c];c++)q(this,f);b||this.i()};function q(a,b){b.s=!1;b.draggable&&google.maps.event.addListener(b,"dragend",function(){b.s=!1;a.L()});a.a.push(b)}j.q=function(a,b){q(this,a);b||this.i()};function r(a,b){var c=-1;if(a.a.indexOf)c=a.a.indexOf(b);else for(var f=0,g;g=a.a[f];f++)if(g==b){c=f;break}if(c==-1)return!1;b.setMap(d);a.a.splice(c,1);return!0}j.Y=function(a,b){var c=r(this,a);return!b&&c?(this.m(),this.i(),!0):!1};
    j.Z=function(a,b){for(var c=!1,f=0,g;g=a[f];f++)g=r(this,g),c=c||g;if(!b&&c)return this.m(),this.i(),!0};j.U=function(){return this.f.length};j.getMap=h("c");j.setMap=e("c");j.w=h("g");j.aa=e("g");
    j.v=function(a){var b=this.getProjection(),c=new google.maps.LatLng(a.getNorthEast().lat(),a.getNorthEast().lng()),f=new google.maps.LatLng(a.getSouthWest().lat(),a.getSouthWest().lng()),c=b.fromLatLngToDivPixel(c);c.x+=this.g;c.y-=this.g;f=b.fromLatLngToDivPixel(f);f.x-=this.g;f.y+=this.g;c=b.fromDivPixelToLatLng(c);b=b.fromDivPixelToLatLng(f);a.extend(c);a.extend(b);return a};j.R=function(){this.m(!0);this.a=[]};
    j.m=function(a){for(var b=0,c;c=this.f[b];b++)c.remove();for(b=0;c=this.a[b];b++)c.s=!1,a&&c.setMap(d);this.f=[]};j.L=function(){var a=this.f.slice();this.f.length=0;this.m();this.i();window.setTimeout(function(){for(var b=0,c;c=a[b];b++)c.remove()},0)};j.i=function(){n(this)};
    function n(a){if(a.A)for(var b=a.v(new google.maps.LatLngBounds(a.c.getBounds().getSouthWest(),a.c.getBounds().getNorthEast())),c=0,f;f=a.a[c];c++)if(!f.s&&b.contains(f.getPosition())){for(var g=a,u=4E4,o=d,v=0,m=void 0;m=g.f[v];v++){var i=m.getCenter();if(i){var p=f.getPosition();if(!i||!p)i=0;else var w=(p.lat()-i.lat())*Math.PI/180,x=(p.lng()-i.lng())*Math.PI/180,i=Math.sin(w/2)*Math.sin(w/2)+Math.cos(i.lat()*Math.PI/180)*Math.cos(p.lat()*Math.PI/180)*Math.sin(x/2)*Math.sin(x/2),i=6371*2*Math.atan2(Math.sqrt(i),
            Math.sqrt(1-i));i<u&&(u=i,o=m)}}o&&o.F.contains(f.getPosition())?o.q(f):(m=new s(g),m.q(f),g.f.push(m))}}function s(a){this.k=a;this.c=a.getMap();this.g=a.w();this.l=a.l;this.r=a.r;this.d=d;this.a=[];this.F=d;this.n=new t(this,a.z(),a.w())}j=s.prototype;
    j.q=function(a){var b;a:if(this.a.indexOf)b=this.a.indexOf(a)!=-1;else{b=0;for(var c;c=this.a[b];b++)if(c==a){b=!0;break a}b=!1}if(b)return!1;if(this.d){if(this.r)c=this.a.length+1,b=(this.d.lat()*(c-1)+a.getPosition().lat())/c,c=(this.d.lng()*(c-1)+a.getPosition().lng())/c,this.d=new google.maps.LatLng(b,c),y(this)}else this.d=a.getPosition(),y(this);a.s=!0;this.a.push(a);b=this.a.length;b<this.l&&a.getMap()!=this.c&&a.setMap(this.c);if(b==this.l)for(c=0;c<b;c++)this.a[c].setMap(d);b>=this.l&&a.setMap(d);
        a=this.c.getZoom();if((b=this.k.I())&&a>b)for(a=0;b=this.a[a];a++)b.setMap(this.c);else if(this.a.length<this.l)z(this.n);else{b=this.k.H()(this.a,this.k.z().length);this.n.setCenter(this.d);a=this.n;a.B=b;a.ga=b.text;a.ea=b.index;if(a.b)a.b.innerHTML=b.text;b=Math.max(0,a.B.index-1);b=Math.min(a.j.length-1,b);b=a.j[b];a.da=b.url;a.h=b.height;a.p=b.width;a.M=b.textColor;a.e=b.anchor;a.N=b.textSize;a.D=b.backgroundPosition;this.n.show()}return!0};
    j.getBounds=function(){for(var a=new google.maps.LatLngBounds(this.d,this.d),b=this.o(),c=0,f;f=b[c];c++)a.extend(f.getPosition());return a};j.remove=function(){this.n.remove();this.a.length=0;delete this.a};j.T=function(){return this.a.length};j.o=h("a");j.getCenter=h("d");function y(a){a.F=a.k.v(new google.maps.LatLngBounds(a.d,a.d))}j.getMap=h("c");
    function t(a,b,c){a.k.extend(t,google.maps.OverlayView);this.j=b;this.fa=c||0;this.u=a;this.d=d;this.c=a.getMap();this.B=this.b=d;this.t=!1;this.setMap(this.c)}j=t.prototype;
    j.onAdd=function(){this.b=document.createElement("DIV");if(this.t)this.b.style.cssText=A(this,B(this,this.d)),this.b.innerHTML=this.B.text;this.getPanes().overlayMouseTarget.appendChild(this.b);var a=this;google.maps.event.addDomListener(this.b,"click",function(){var b=a.u.k;google.maps.event.trigger(b,"clusterclick",a.u);b.O&&a.c.fitBounds(a.u.getBounds())})};function B(a,b){var c=a.getProjection().fromLatLngToDivPixel(b);c.x-=parseInt(a.p/2,10);c.y-=parseInt(a.h/2,10);return c}
    j.draw=function(){if(this.t){var a=B(this,this.d);this.b.style.top=a.y+"px";this.b.style.left=a.x+"px"}};function z(a){if(a.b)a.b.style.display="none";a.t=!1}j.show=function(){if(this.b)this.b.style.cssText=A(this,B(this,this.d)),this.b.style.display="";this.t=!0};j.remove=function(){this.setMap(d)};j.onRemove=function(){if(this.b&&this.b.parentNode)z(this),this.b.parentNode.removeChild(this.b),this.b=d};j.setCenter=e("d");
    function A(a,b){var c=[];c.push("background-image:url("+a.da+");");c.push("background-position:"+(a.D?a.D:"0 0")+";");typeof a.e==="object"?(typeof a.e[0]==="number"&&a.e[0]>0&&a.e[0]<a.h?c.push("height:"+(a.h-a.e[0])+"px; padding-top:"+a.e[0]+"px;"):c.push("height:"+a.h+"px; line-height:"+a.h+"px;"),typeof a.e[1]==="number"&&a.e[1]>0&&a.e[1]<a.p?c.push("width:"+(a.p-a.e[1])+"px; padding-left:"+a.e[1]+"px;"):c.push("width:"+a.p+"px; text-align:center;")):c.push("height:"+a.h+"px; line-height:"+a.h+
        "px; width:"+a.p+"px; text-align:center;");c.push("cursor:pointer; top:"+b.y+"px; left:"+b.x+"px; color:"+(a.M?a.M:"black")+"; position:absolute; font-size:"+(a.N?a.N:11)+"px; font-family:Arial,sans-serif; font-weight:bold");return c.join("")}window.MarkerClusterer=k;k.prototype.addMarker=k.prototype.q;k.prototype.addMarkers=k.prototype.C;k.prototype.clearMarkers=k.prototype.R;k.prototype.fitMapToMarkers=k.prototype.S;k.prototype.getCalculator=k.prototype.H;k.prototype.getGridSize=k.prototype.w;
    k.prototype.getExtendedBounds=k.prototype.v;k.prototype.getMap=k.prototype.getMap;k.prototype.getMarkers=k.prototype.o;k.prototype.getMaxZoom=k.prototype.I;k.prototype.getStyles=k.prototype.z;k.prototype.getTotalClusters=k.prototype.U;k.prototype.getTotalMarkers=k.prototype.V;k.prototype.redraw=k.prototype.i;k.prototype.removeMarker=k.prototype.Y;k.prototype.removeMarkers=k.prototype.Z;k.prototype.resetViewport=k.prototype.m;k.prototype.repaint=k.prototype.L;k.prototype.setCalculator=k.prototype.$;
    k.prototype.setGridSize=k.prototype.aa;k.prototype.setMaxZoom=k.prototype.ba;k.prototype.onAdd=k.prototype.onAdd;k.prototype.draw=k.prototype.draw;s.prototype.getCenter=s.prototype.getCenter;s.prototype.getSize=s.prototype.T;s.prototype.getMarkers=s.prototype.o;t.prototype.onAdd=t.prototype.onAdd;t.prototype.draw=t.prototype.draw;t.prototype.onRemove=t.prototype.onRemove;
})();
/**
 * Created by mhirdes on 27.11.13.
 */
(function ($) {
    var GoMapsExt = window.GoMapsExt = window.GoMapsExt || {};

    GoMapsExt.Data = {
        mapSettings: {
            markerSearch: null,
            defaultZoom: null,
            doubleClickZoom: null,
            scrollZoom: null,
            scaleControl: null,
            streetviewControl: null,
            fullscreenControl: null,
            zoomControl: null,
            defaultType: null,
            mapTypeControl: null,
            mapTypes: null,
            showRoute: null,
            calcRoute: null,
            styledMapName: null,
            styledMapCode: null,
            tooltipTitle: null,
            kmlUrl: null,
            kmlLocal: null,
            showForm: null,
            lat: null,
            lng: null,
            geolocation: null
        },
        zoomTypes: [],
        defaultMapTypes: [],
        addresses: []
    };

    /**
     * Controller for Map functionality
     *
     * @param {HTMLElement} element
     * @param {GoMapsExt.Data} gme
     * @constructor
     */
    GoMapsExt.Controller = function (element, gme) {
        this.element = $(element);
        this.gme = gme;
        this.data = gme;

        if(typeof google !== "undefined" && typeof google.maps !== "undefined") {
            this.initialize();
        }
    };

    GoMapsExt.Controller.prototype = {

        initialize: function() {
            var $element = this.element;
	        this.route = [];
	        this.infoWindow = new google.maps.InfoWindow();
	        this.bounds = new google.maps.LatLngBounds();
	        this.markers = [];

	        this.map = new google.maps.Map(document.getElementById(this.gme.mapSettings.id), this._createMapOptions());

	        this._initializeCss();
	        this._initializeData();
	        this._initializeKmlImport();
            this._initializeGeolocation();

	        this._initializeSearch();
	        this._initializeBackendAddresses();
	        this._initializeRoute();
	        this._initializeResizeListener();
	        this._initializeCheckboxListener();
	        this._initializeAddressListener();

	        // open info window
	        window.setTimeout(function () {
		        $element.trigger("openinfo");
	        }, 2000);

	        this.setCategoriesFromRequest();
	        this.focusAddressFromRequest();

	        // trigger mapcreated on map
	        $element.trigger("mapcreated");

	        this.refreshMap($element, this.gme);
        },

        // categories checkboxes
        setCategories: function (selectedCats) {
            var gme = this.data,
                $element = this.element;

            $.each(this.markers, function (key, marker) {
                if (selectedCats.length > 0) {
                    marker.setVisible(false);
                    var matches = 0;
                    $.each(marker.categories, function (keyM, category) {
                        if ($.inArray(category, selectedCats) != -1) {
                            matches += 1;
                        }
                    });
                    var showMarker = (matches > 0);
                    if (gme.mapSettings.logicalAnd) {
                        showMarker = (matches == selectedCats.length);
                    }
                } else {
                    showMarker = true;
                }
                if (showMarker) {
                    marker.setVisible(true);
                    if ($('#gme-address'+marker.uid).parent().is('del')) {
                        $('#gme-address'+marker.uid).unwrap();
                    }
                    return true;
                } else {
                    if (! $('#gme-address'+marker.uid).parent().is('del')) {
                        $('#gme-address'+marker.uid).wrap('<del></del>');
                    }
                }
            });
            if ($element.markerCluster) {
                $element.markerCluster.repaint();
            }
        },

        setCategoriesFromRequest: function () {
            // set categories
            var getCats = this.getURLParameter('tx_gomapsext_show\\[cat\\]');
            if (getCats) {
                getCats = getCats.split(",");
                this.setCategories(getCats);
                $('.js-gme-cat').each(function (key, checkbox) {
                    if ($.inArray($(checkbox).val(), getCats) != -1) {
                        $(checkbox).attr('checked', true);
                        return true;
                    }
                });
            }
        },

        focusAddressFromRequest: function () {
            var getAddress = this.getURLParameter('tx_gomapsext_show\\[address\\]'),
                $element = this.element,
                gme = this.data;
            if (getAddress) {
                this.focusAddress(getAddress, $element, gme);
            }
        },

        // add a point
        addMapPoint: function (pointDescription, Route, $element, infoWindow, gme) {
            var _this = this,
                latitude = pointDescription.latitude,
                longitude = pointDescription.longitude;

            Route.push(pointDescription.address);

            if (Math.round(latitude) == 0 && Math.round(longitude) == 0) {
                $element.data("geocoder").geocode({"address": pointDescription.address}, function (point, status) {
                    latitude = point[0].geometry.location.lat();
                    longitude = point[0].geometry.location.lng();
                    var position = new google.maps.LatLng(latitude, longitude);
                    _this.setMapPoint(pointDescription, Route, $element, infoWindow, position, gme);
                });
                return;
            }

            var position = new google.maps.LatLng(latitude, longitude);

            this.setMapPoint(pointDescription, Route, $element, infoWindow, position, gme);
        },

        focusAddress: function (addressUid, $element, gme) {
            var _this = this;
            $.each(this.markers, function (key, marker) {
                if (marker.uid == addressUid) {
                    $element.data("center", marker.position);
                    if (marker.infoWindow) {
                        marker.infoWindow.setContent(marker.infoWindowContent);
                        marker.infoWindow.open(_this.map, marker);
                    }
                    _this.refreshMap($element, gme);
                    return true;
                }
            });
            if ($element.markerCluster) {
                $element.markerCluster.repaint();
            }
        },

        /**
         * decode URL Parameter go_maps_ext[cat]
         *
         * @param name
         * @returns {string|null}
         */
        getURLParameter: function (name) {
            var uri = decodeURI(location.search);
            return (new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(uri) || ["", ""])[1].replace(/\+/g, '%20') || null;
        },

        /**
         * get the travel mode
         *
         * @param $travelMode
         * @returns {string}
         */
        getTravelMode: function ($travelMode) {
            var travelMode = google.maps.TravelMode.DRIVING;
            switch ($travelMode) {
                case 2:
                    travelMode = google.maps.TravelMode.BICYCLING;
                    break;
                case 3:
                    travelMode = google.maps.TravelMode.TRANSIT;
                    break;
                case 4:
                    travelMode = google.maps.TravelMode.WALKING;
                    break;
            }
            return travelMode;
        },

        /**
         * get the unit system
         *
         *  @param $unitSystem
         * @returns {number}
         */
        getUnitSystem: function ($unitSystem) {
            var unitSystem = 0;
            switch ($unitSystem) {
                case 2:
                    unitSystem = google.maps.UnitSystem.METRIC;
                    break;
                case 3:
                    unitSystem = google.maps.UnitSystem.IMPERIAL;
                    break;
            }
            return unitSystem;
        },

        /**
         * insert the point on the map
         *
         * @param pointDescription
         * @param Route
         * @param $element
         * @param infoWindow
         * @param position
         * @param gme
         */
        setMapPoint: function (pointDescription, Route, $element, infoWindow, position, gme) {
            var _map = this.map,
                markerOptions = {
                    position: position,
                    map: _map,
                    title: pointDescription.title
                };
            if (pointDescription.marker != "") {
                if (pointDescription.imageSize == 1) {
                    var Icon = {
                        url: pointDescription.marker,
                        size: new google.maps.Size(pointDescription.imageWidth * 2, pointDescription.imageHeight * 2),
                        scaledSize: new google.maps.Size(pointDescription.imageWidth, pointDescription.imageHeight),
                        origin: new google.maps.Point(0, 0),
                        anchor: new google.maps.Point(pointDescription.imageWidth / 2, pointDescription.imageHeight)
                    };

	                var Shape = {
		                type: 'rect',
		                coord: [0, 0, pointDescription.imageWidth, pointDescription.imageHeight]
	                };

                    var anchorPoint = new google.maps.Point(0, -pointDescription.imageHeight);

	                $.extend(markerOptions, {icon: Icon, shape: Shape, anchorPoint: anchorPoint});
                } else {
	                $.extend(markerOptions, {icon: pointDescription.marker});
                }

            }
            var marker = new google.maps.Marker(markerOptions);

            if (gme.mapSettings.markerCluster == 1) {
                google.maps.event.addListener(marker, 'visible_changed', function () {
                    if (marker.getVisible()) {
                        $element.markerCluster.addMarker(marker, true);
                    } else {
                        $element.markerCluster.removeMarker(marker, true);
                    }
                });
            }

            if (pointDescription.infoWindowContent != "" || pointDescription.infoWindowLink > 0) {
                var infoWindowContent = pointDescription.infoWindowContent;
                if (pointDescription.infoWindowLink > 0) {
                    var daddr = (pointDescription.infoWindowLink == 2) ? pointDescription.latitude + ", " + pointDescription.longitude : pointDescription.address;
                    infoWindowContent += '<p class="routeLink"><a href="//www.google.com/maps/dir/?api=1&destination=' + encodeURI(daddr) + '" target="_blank">' + gme.ll.infoWindowLinkText + '<\/a><\/p>';
                }
                infoWindowContent = '<div class="gme-info-window">' + infoWindowContent + '</div>';

                if (pointDescription.openByClick) {
                    google.maps.event.addListener(marker, "click", function () {
                        if (!infoWindow.getMap() || gme.infoWindow != this.getPosition()) {
                            infoWindow.setContent(infoWindowContent);
                            infoWindow.open(_map, this);
                            gme.infoWindow = this.getPosition();
                        }
                    });
                } else {
                    google.maps.event.addListener(marker, "mouseover", function () {
                        if (!infoWindow.getMap() || gme.infoWindow != this.getPosition()) {
                            infoWindow.setContent(infoWindowContent);
                            infoWindow.open(_map, this);
                            gme.infoWindow = this.getPosition();
                        }
                    });
                }
                if (!pointDescription.closeByClick) {
                    google.maps.event.addListener(marker, "mouseout", function () {
                        infoWindow.close();
                    });
                }
                if (pointDescription.opened) {

                    $element.off("openinfo").on("openinfo", function () {
                        infoWindow.setContent(infoWindowContent);
                        infoWindow.open(_map, marker);
                    });
                    gme.infoWindow = marker.getPosition();
                }

                infoWindow.setContent(infoWindowContent);
                marker.infoWindowContent = infoWindowContent;
                marker.infoWindow = infoWindow;
            }
            marker.categories = pointDescription.categories.split(",");
            marker.uid = pointDescription.uid;
            this.markers.push(marker);
            this.bounds.extend(position);
        },

        resize: function() {
            var _map = this.map,
                gme = this.data;

            google.maps.event.trigger(_map, 'resize');
            _map.fitBounds(this.bounds);
            if (gme.mapSettings.zoom > 0) {
                _map.setZoom(gme.mapSettings.zoom);
            }
            this.refreshMap(this.element, gme);
            google.maps.event.trigger(this.infoWindow, 'content_changed');
        },

        /**
         * Set zoom, center and cluster
         *
         * @param $element
         * @param gme
         */
        refreshMap: function ($element, gme) {
            var _map = this.map;
            if (gme.mapSettings.zoom > 0 || gme.addresses.length == 1) {
                google.maps.event.addListener(_map, "zoom_changed", function () {
                    var zoomChangeBoundsListener = google.maps.event.addListener(_map, "bounds_changed", function () {
                        if (this.initZoom == 1) {
                            this.setZoom((gme.mapSettings.zoom > 0) ? gme.mapSettings.zoom : gme.mapSettings.defaultZoom);
                            this.initZoom = 0;
                        }
                        google.maps.event.removeListener(zoomChangeBoundsListener);
                    });
                });
                _map.initZoom = 1;
            }

            if ($element.data("center")) {
                _map.setCenter($element.data("center"));
            } else if(gme.mapSettings.lat && gme.mapSettings.lng) {
                _map.setCenter(new google.maps.LatLng(gme.mapSettings.lat, gme.mapSettings.lng));
                _map.setZoom(gme.mapSettings.zoom);
            } else {
                _map.fitBounds(this.bounds);
            }

            this.refreshCluster($element, gme);
        },

        /**
         * refresh the cluster
         *
         * @param $element
         * @param gme
         */
        refreshCluster: function ($element, gme) {
            if (gme.mapSettings.markerCluster == 1) {
                if ($element.markerCluster != null) {
                    $element.markerCluster.clearMarkers();
                }
                $element.markerCluster = new MarkerClusterer(this.map, this.markers, {
                    imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m',
                    styles: gme.mapSettings.markerClusterStyle,
                    maxZoom: gme.mapSettings.markerClusterZoom,
                    gridSize: gme.mapSettings.markerClusterSize
                });
            }
        },

        _initializeCss: function () {
            this.element
                .css("width", this.gme.mapSettings.width)
                .css("height", this.gme.mapSettings.height);
        },
        _initializeData: function () {
            var $element = this.element,
                gme = this.data,
                _map = this.map;

            $element.data("map", _map);

            // styled map
            if (gme.mapSettings.styledMapName) {
                var myStyle = gme.mapSettings.styledMapCode,
                    styledMapOptions = {
                        name: gme.mapSettings.styledMapName,
                        alt: gme.mapSettings.tooltipTitle
                    },
                    myMapType = new google.maps.StyledMapType(
                        myStyle,
                        styledMapOptions
                    );
                _map.mapTypes.set(gme.mapSettings.styledMapName, myMapType);
            }

            if (gme.mapSettings.defaultType == 3 && gme.mapSettings.styledMapName) {
                _map.setMapTypeId(gme.mapSettings.styledMapName);
            }

        },

        _createMapOptions: function () {
            var gme = this.gme;
            return {
                zoom: gme.mapSettings.defaultZoom,
                minZoom: gme.mapSettings.minZoom,
                maxZoom: gme.mapSettings.maxZoom,
                center: new google.maps.LatLng(0, 0),
                geolocation: gme.mapSettings.geolocation,
                draggable: gme.mapSettings.draggable,
                disableDoubleClickZoom: gme.mapSettings.doubleClickZoom,
                gestureHandling: gme.mapSettings.scrollZoom ? 'auto' : 'none',
                scaleControl: gme.mapSettings.scaleControl,
                streetViewControl: gme.mapSettings.streetviewControl,
                fullscreenControl: gme.mapSettings.fullscreenControl,
                zoomControl: gme.mapSettings.zoomControl,
                mapTypeId: gme.defaultMapTypes[gme.mapSettings.defaultType],
                mapTypeControl: gme.mapSettings.mapTypeControl,
                mapTypeControlOptions: {mapTypeIds: gme.mapSettings.mapTypes}
            };
        },

        _initializeKmlImport: function () {
            var _this = this,
                _map = this.map,
                gme = this.data,
                Route = this.route,
                $element = this.element;

            // KML import
            if (gme.mapSettings.kmlUrl != '' && gme.mapSettings.kmlLocal == 0) {
                var kmlLayer = new google.maps.KmlLayer(gme.mapSettings.kmlUrl, {preserveViewport: gme.mapSettings.kmlPreserveViewport});
                kmlLayer.setMap(_map);
            }

            // KML import local
            if (gme.mapSettings.kmlUrl != '' && gme.mapSettings.kmlLocal == 1) {
                $.get(gme.mapSettings.kmlUrl, function (data) {

                    //loop through placemarks tags
                    $(data).find("Placemark").each(function () {
                        //get coordinates and place name
                        var coords = $(this).find("coordinates").text(),
                            place = $(this).find("name").text(),
                            description = $(this).find("description").text(),
                            c = coords.split(","),
                            address = {
                                title: place,
                                latitude: c[1],
                                longitude: c[0],
                                address: place,
                                marker: '',
                                imageSize: 0,
                                imageWidth: 0,
                                imageHeight: 0,
                                infoWindowContent: description,
                                infoWindowLink: 0,
                                openByClick: 1,
                                closeByClick: 1,
                                opened: 0,
                                categories: ''
                            };
                        _this.addMapPoint(address, Route, $element, _this.infoWindow, gme);
                        gme.addresses.push(address);
                    });
                });
            }
        },

        _initializeGeolocation: function () {
            var _this = this,
                _map = this.map,
                gme = this.data;

            // geolocation
            if (gme.mapSettings.geolocation == 1) {
                var myloc = new google.maps.Marker({
                    clickable: false,
                    icon: {
                      path: google.maps.SymbolPath.CIRCLE,
                      scale: 9,
                      fillColor: '#408fff',
                      fillOpacity: 1,
                      strokeColor: 'white',
                      strokeWeight: 3
                    },
                    zIndex: 999,
                    map: _map
                });

                if (navigator.geolocation) navigator.geolocation.getCurrentPosition(function(pos) {
                    var me = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
                    myloc.setPosition(me);
                    var mycenter = {
                        lat: pos.coords.latitude,
                        lng: pos.coords.longitude
                    };
                    _map.setCenter(mycenter);
                }, function(error) {
                    console.log('could not get position');
                });
            }
        },

        _initializeSearch: function () {
            var _this = this,
                gme = this.data,
                $element = this.element;

            // Search
            if (gme.mapSettings.markerSearch == 1) {
                var $myForm = $('#' + gme.mapSettings.id + '-search'),
                    searchIn = $myForm.find('.js-gme-sword');

                $myForm.find('.js-gme-error').hide();

                $myForm.submit(function () {
                    var submitValue = $(searchIn).val().toLowerCase();
                    var notFound = true;
                    $.each(gme.addresses, function (i, address) {
                        $.each(address, function (index, val) {
                            if (typeof val == "string" && (index == "title" || index == "infoWindowContent") && submitValue != "") {
                                if (val.toLowerCase().indexOf(submitValue) != -1) {
                                    _this.focusAddress(_this.markers[i].uid, $element, gme);
                                    notFound = false;
                                }
                            }
                        });
                    });
                    $myForm.find('.js-gme-error').toggle(notFound);
                    return false;
                });
            }
        },

        _initializeBackendAddresses: function () {
            var _this = this,
                gme = this.data,
                $element = this.element,
                Route = this.route,
                infoWindow = this.infoWindow;

            // Add backend addresses
            if (gme.mapSettings.showRoute == 0) {
                $element.data("geocoder", new google.maps.Geocoder());
                if ($element.data("geocoder")) {
                    $.each(gme.addresses, function (index, address) {
                        _this.addMapPoint(address, Route, $element, infoWindow, gme);
                    });

                }
            }
        },

        _initializeRoute: function () {
            var _this = this,
                _map = this.map,
                gme = this.data,
                $element = this.element;

            // init Route function
            if (gme.mapSettings.showRoute == 1 || gme.mapSettings.calcRoute == 1) {
                var panelHtml = $('<div id="dPanel-' + gme.mapSettings.id + '"><\/div>'),
                    directionsService = new google.maps.DirectionsService(),
                    directionsDisplay = new google.maps.DirectionsRenderer();

                panelHtml.insertAfter($element);

                var renderRoute = function ($start, $end, $travelMode, $unitSystem) {
                    var unitSystem = _this.getUnitSystem($unitSystem),
                        request = {
                            origin: $start,
                            destination: $end,
                            travelMode: _this.getTravelMode($travelMode)
                        };

                    directionsDisplay.setMap(_map);
                    directionsDisplay.setPanel(document.getElementById("dPanel-" + gme.mapSettings.id));

                    if (unitSystem != 0) {
                        request.unitSystem = unitSystem;
                    }

                    directionsService.route(request, function (response, status) {
                        if (status == google.maps.DirectionsStatus.OK) {
                            directionsDisplay.setDirections(response);
                        } else {
                            alert(gme.ll.alert);
                        }
                    });
                };
            }

            // show route from backend
            if (gme.mapSettings.showRoute == 1) {
                renderRoute(gme.addresses[0].address, gme.addresses[1].address, gme.mapSettings.travelMode, gme.mapSettings.unitSystem);
            }

            // show route from frontend
            if (gme.mapSettings.showForm == 1) {
                var $mapForm = $('#' + gme.mapSettings.id + '-form');

                $mapForm.submit(function () {
                    var formStartAddress = $mapForm.find('.js-gme-saddress').val(),
                        endAddressIndex = $mapForm.find('.js-gme-eaddress option:selected').val(),
                        formEndAddress = endAddressIndex ?
                            gme.addresses[parseInt(endAddressIndex)].address :
                            gme.addresses[0].address,
                        formTravelMode = $mapForm.find('.js-gme-travelmode').val(),
                        formUnitSystem = $mapForm.find('.js-gme-unitsystem').val();

                    if (formStartAddress == null) {
                        formStartAddress = gme.addresses[0].address;
                        formEndAddress = gme.addresses[1].address;
                    }

                    if (formTravelMode == null) {
                        formTravelMode = gme.mapSettings.travelMode;
                    } else {
                        formTravelMode = parseInt(formTravelMode);
                    }
                    if (formUnitSystem == null) {
                        formUnitSystem = gme.mapSettings.unitSystem;
                    } else {
                        formUnitSystem = parseInt(formUnitSystem);
                    }

                    renderRoute(formStartAddress, formEndAddress, formTravelMode, formUnitSystem);
                    return false;
                });
            }
        },

        _initializeResizeListener: function () {
            var _this = this,
                width = $(this.element).width();

            // eventHandler resize can be used
            this.element.bind('mapresize', function () {
                // resize only when the window width changes, not while hiding a browser bar
                if($(this).width() != width) {
                    width = $(this).width();
                    _this.resize();
                }
            });
        },

        _initializeCheckboxListener: function () {
            var _this = this;

            // categories checkboxes
            $('.js-gme-cat').change(function () {
                var selectedCats = $('.js-gme-cat:checked').map(function () {
                    return this.value;
                });
                _this.setCategories(selectedCats);
            });
        },

        _initializeAddressListener: function () {
            var _this = this,
                $element = this.element,
                gme = this.gme;

            $('.js-gme-address').click(function () {
                var selectedAddress = [$(this).attr('data-address')];
                _this.focusAddress(selectedAddress, $element, gme);
                return false;
            });
        }
    };

    // create a new Google Map
    $.fn.gomapsext = function (gme) {
        var $element = $(this);
        if (!$element.data('gomapsextcontroller')) {
            $element.data('gomapsextcontroller', new GoMapsExt.Controller($element, gme));
        }
    };
}(jQuery || $));

/**
 *  add listener to load map
 */
jQuery(document).ready(function ($) {
    var $links = $('.js-gme-show'),
        $preview = $('.js-gme-preview'),
        $mapContainer = $('.js-gme-container'),
        useCookies = $preview.data('cookie'),
        hideMap = true;

	if(useCookies) {
		if($.cookie('tx_gomapsext_show_map')) {
			showMap();
			hideMap = false;
		}
	}

	if(hideMap) {
		$mapContainer.hide();

		$links.click(function (e) {
			e.preventDefault();
			showMap();
			if(useCookies) {
				$.cookie('tx_gomapsext_show_map', 1, {path:'/'});
			}
		});
	}

	function showMap() {
		if(typeof google === "undefined" || typeof google.maps === "undefined") {
			$('body').append($('<script>').attr('src', $links.data('library') + '&callback=GoMapsExtLoaded'));
			$mapContainer.show();
		}
		$preview.remove();
	}

});

/**
 * global google maps api callback
 */
function GoMapsExtLoaded() {
	jQuery('.js-map').each(function(key, el) {
		jQuery(el).data('gomapsextcontroller').initialize();
	});
}

    (function ($, window, document, undefined) {
    $(function () {
    var gme = new Object();

    gme.zoomTypes = new Array(0,1,2);
    gme.defaultMapTypes = new Array("roadmap", "satellite", "hybrid", "terrain", "");

    gme.mapSettings = {
    id: 'gme-' + 1,
    title: 'Standort',
    width: '100%',
    height: '400px',
    zoom: 17,
    minZoom: 0,
    maxZoom: 0,
    lat: 0,
    lng: 0,
    geolocation: 0,
    kmlUrl: '',
    kmlPreserveViewport: false,
    kmlLocal: 0,
    scrollZoom: 0,
    draggable: 1,
    doubleClickZoom: 0,
    markerCluster: 1,
    markerClusterZoom: null,
    markerClusterSize: null,
    
            markerClusterStyle: '',
        
    markerSearch: 0,
    defaultType: 0,
    scaleControl: 0,
    streetviewControl: 1,
    fullscreenControl: 1,
    zoomControl: 1,
    mapTypeControl: 1,
    showRoute: 0,
    calcRoute: 0,
    travelMode: 0,
    unitSystem: 2,
    showForm: 0,
    showCategories: 0,
    logicalAnd: 0,
    styledMapName: '',
    
            styledMapCode: '',
        
    defaultZoom: 11
    }

    gme.mapSettings.mapTypes = new Array();
    
        gme.mapSettings.mapTypes[0] = gme.defaultMapTypes[0];
    
        gme.mapSettings.mapTypes[1] = gme.defaultMapTypes[1];
    
        gme.mapSettings.mapTypes[2] = gme.defaultMapTypes[2];
    

    gme.request = new Array();

    

    gme.addresses = new Array();
    
        gme.addresses[0]  = {
        uid: 1,
        title: 'Standort Weinfelden',
        latitude: 47.568970,
        longitude: 9.109670,
        address: 'Frauenfelderstrasse 4 Weinfelden',
        
                
            

        imageWidth: '0',
        imageHeight: '0',
        infoWindowContent: '',
        infoWindowLink: '0',
        
                openByClick: 0,
            
        
                closeByClick: 0,
            
        opened: 0,
        categories: ''
        }
    

    gme.ll = {};
    gme.ll.alert = "Bitte geben Sie eine gültige Adresse ein.";
    gme.ll.submit = "Route berechnen";
    gme.ll.noSearchResults = "Die Suche lieferte keine Ergebnisse.";
    gme.ll.infoWindowLinkText = "Route berechnen";
    var $element = $("#" + gme.mapSettings.id);
    $element.gomapsext(gme);
    if(gme.mapSettings.width.indexOf('%') != -1) {
        $(window).resize(function() {
            $element.trigger('mapresize');
        });
    }

    }); // end of closure
    })(jQuery || $, window, document);

$(document).foundation(),$(document).ready((function(){var o=$(".top-arrow");$(window).scrollTop()>=600?o.addClass("scrolled"):o.removeClass("scrolled")})),$(".top-arrow").on("click",(function(){$("html, body").animate({scrollTop:0},500)})),$(document).on("keypress",".top-arrow",(function(o){13==o.which&&$("html, body").animate({scrollTop:0},500)})),$(window).scroll((function(){var o=$(".top-arrow"),e=$(window).scrollTop();$(this).width()>=1240?e>=600?o.addClass("scrolled"):o.removeClass("scrolled"):e>=200?o.addClass("scrolled"):o.removeClass("scrolled")})),$(".mobile-listitem-level-1 .arrow").on("click",(function(){$(this).children("i").toggleClass("down"),$(this).parents(".mobile-listitem-level-1").children(".menu-level-2").slideToggle(200)})),$("#offCanvas").on("opened.zf.offcanvas",(function(){$(".hamburger").toggleClass("is-active")})).on("closed.zf.offcanvas",(function(){$(".hamburger").toggleClass("is-active")})),jQuery.fn.preventDoubleSubmission=function(){return $(this).on("submit",(function(o){var e=$(this);!0===e.data("submitted")?o.preventDefault():e.data("submitted",!0)})),this};
$(document).ready((function(){var i={};$(".swiper-container").each((function(t){switch($(this).attr("data-swipertype")){case"ce-swiper":$(this).find(".swiper-slide").length>1&&($(this).find(".swiper-button-prev").css("display","block"),$(this).find(".swiper-button-next").css("display","block"),$(this).addClass("instance-"+t),$(this).find(".swiper-button-prev").addClass("btn-prev-"+t),$(this).find(".swiper-button-next").addClass("btn-next-"+t),$(this).find(".swiper-pagination").addClass("swiper-pagination-"+t),i[t]=new Swiper(".instance-"+t,{loop:!0,autoplay:{delay:7500},pagination:{el:".swiper-pagination-"+t,clickable:!0},navigation:{nextEl:".btn-next-"+t,prevEl:".btn-prev-"+t}}));break;default:$(this).find(".swiper-slide").length>1&&($(this).find(".swiper-button-prev").css("display","block"),$(this).find(".swiper-button-next").css("display","block"),$(this).addClass("instance-"+t),$(this).find(".swiper-button-prev").addClass("btn-prev-"+t),$(this).find(".swiper-button-next").addClass("btn-next-"+t),$(this).find(".swiper-pagination").addClass("btn-next-"+t),i[t]=new Swiper(".instance-"+t,{loop:!0,autoplay:7500,pagination:{el:".swiper-pagination-"+t,clickable:!0},navigation:{nextEl:".btn-next-"+t,prevEl:".btn-prev-"+t}}))}}))}));
$(document).ready((function(){$("a.lightbox").length>0&&$.ajax({url:"/typo3conf/ext/weinundmehr/Resources/Public/html/photoswipe.html",success:function(t){$("body").append(t);var i=function(t,i){var n=document.querySelectorAll(".pswp")[0],e=[];$("a.lightbox[rel="+i+"]").each((function(){var t="";t=$(this).data("lightbox-caption")?$(this).data("lightbox-caption"):$(this).next("figcaption").text(),e.push({src:$(this).attr("href"),title:1,w:$(this).data("lightbox-width"),h:$(this).data("lightbox-height"),caption:t.replace(/(?:\r\n|\r|\n)/g,"<br />"),pid:$(this).index("a.lightbox[rel="+i+"]")})}));var l={index:t,addCaptionHTMLFn:function(t,i){return t.caption?(i.children[0].innerHTML='<div class="pswp__caption__title">'+t.caption+"</div>",!0):(i.children[0].innerHTML="",!1)},spacing:.12,loop:!0,bgOpacity:1,closeOnScroll:!0,history:!0,galleryUID:i,galleryPIDs:!0,closeEl:!0,captionEl:!0,fullscreenEl:!0,zoomEl:!0,shareEl:!0,counterEl:!0,arrowEl:!0,preloaderEl:!0};e.length>0&&new PhotoSwipe(n,PhotoSwipeUI_Default,e,l).init()},n=function(){var t=window.location.hash.substring(1),i={};if(t.length<5)return i;for(var n=t.split("&"),e=0;e<n.length;e++)if(n[e]){var l=n[e].split("=");l.length<2||(i[l[0]]=l[1])}return i}();n.pid&&n.gid&&i(parseInt(n.pid),n.gid),$("a.lightbox").on("click",(function(t){t.preventDefault();var n=$(this).attr("rel"),e=$(this).index("a.lightbox[rel="+n+"]");i(e,n)}))},dataType:"html"})}));
function cookieconsentinit() {

    const cc = initCookieConsent();
    const dataPrivacyUrl = document.querySelector('.js-data-privacy').href;

    // run plugin with your configuration
    cc.run({
        current_lang: document.documentElement.getAttribute('lang'),
        autoclear_cookies: true,               // default: false
        page_scripts: true,                       // default: false

        // mode: 'opt-in'                          // default: 'opt-in'; value: 'opt-in' or 'opt-out'
        // delay: 0,                               // default: 0
        auto_language: 'document',                 // default: null; could also be 'browser' or 'document'
        // autorun: true,                          // default: true
        // force_consent: false,                   // default: false
        // hide_from_bots: false,                  // default: false
        // remove_cookie_tables: false             // default: false
        // cookie_name: 'cc_cookie',               // default: 'cc_cookie'
        // cookie_expiration: 182,                 // default: 182 (days)
        // cookie_necessary_only_expiration: 182   // default: disabled
        // cookie_domain: location.hostname,       // default: current domain
        // cookie_path: '/',                       // default: root
        // cookie_same_site: 'Lax',                // default: 'Lax'
        // use_rfc_cookie: false,                  // default: false
        // revision: 0,                            // default: 0

        onFirstAction: function(user_preferences, cookie){
            // callback triggered only once
        },

        onAccept: function (cookie) {
            // ... cookieconsent accepted

        },

        onChange: function (cookie, changed_preferences) {
            // ...
        },

        languages: {
            'de': {
                consent_modal: {
                    title: 'Ihre Privatsphäre ist uns wichtig.',
                    description: 'Unsere Website verwendet essentielle Cookies, um ihren ordnungsgemässen Betrieb zu gewährleisten, und Tracking-Cookies, um zu verstehen, wie Sie mit ihr interagieren. Letztere werden nur nach Zustimmung gesetzt. <button type="button" data-cc="c-settings" class="cc-link">Cookie-Einstellungen</button>',
                    primary_btn: {
                        text: 'Alle akzeptieren',
                        role: 'accept_all'              // 'accept_selected' or 'accept_all'
                    },
                    secondary_btn: {
                        text: 'Alle ablehnen',
                        role: 'accept_necessary'        // 'settings' or 'accept_necessary'
                    }
                },
                settings_modal: {
                    title: 'Cookie-Einstellungen',
                    save_settings_btn: 'Einstellungen speichern',
                    accept_all_btn: 'Alle akzeptieren',
                    reject_all_btn: 'Alle ablehnen',
                    close_btn_label: 'Schliessen',
                    cookie_table_headers: [
                        {col1: 'Name'},
                        {col2: 'Anbieter'},
                        {col3: 'Gültigkeit'},
                        {col4: 'Beschreibung'}
                    ],
                    blocks: [
                        {
                            title: 'Verwendung von Cookies',
                            description: 'Wir verwenden Cookies, um die grundlegenden Funktionen der Website zu gewährleisten und um Ihr Online-Erlebnis zu verbessern. Sie können für jede Kategorie wählen, ob Sie sich ein- oder austragen möchten. Für weitere Einzelheiten zu Cookies und anderen sensiblen Daten lesen Sie bitte die vollständige <a href="' + dataPrivacyUrl + '" class="cc-link">Datenschutzerklärung</a>.'
                        }, {
                            title: 'Notwendige Cookies',
                            description: 'Diese Cookies sind für eine gute Funktionalität unserer Website erforderlich und können in unserem System nicht ausgeschaltet werden. Normalerweise werden diese Cookies durch Ihre Aktionen in Ihren Anfragen für unsere Dienste gesetzt. Beispiele für diese Aktionen sind die Anmeldung, das Ausfüllen von Formularen oder das Festlegen Ihrer Datenschutzeinstellungen. Es ist möglich, dass Ihr Browser diese Cookies blockiert, aber einige Teile unserer Website funktionieren möglicherweise nicht richtig, wenn diese blockiert werden.',
                            toggle: {
                                value: 'necessary',
                                enabled: true,
                                readonly: true          // cookie categories with readonly=true are all treated as "necessary cookies"
                            }
                        }, {
                            title: 'Google Maps Cookies',
                            description: 'Diese Cookies werden von Google Maps auf einzelnen Seiten unserer Website gesetzt, um die Funktionalität der eingebundenen Karten zu gewährleisten.',
                            toggle: {
                                value: 'map',
                                enabled: false,
                                readonly: false
                            }
                        }, {
                            title: 'Performance and Analytics Cookies',
                            description: 'Wir verwenden diese Cookies, um statistische Informationen über unsere Website bereitzustellen. Sie werden zur Leistungsmessung und -verbesserung verwendet.\n' + 'Diese Kategorie wird auch als Analytics bezeichnet. In diese Kategorie fallen Aktivitäten wie das Zählen von Seitenbesuchen, die Geschwindigkeit beim Laden von Seiten, die Absprungrate und die für den Zugriff auf unsere Website verwendeten Technologien.',
                            toggle: {
                                value: 'analytics',     // your cookie category
                                enabled: false,
                                readonly: false
                            },
                            cookie_table: [             // list of all expected cookies
                                {
                                    col1: '_ga',       // match all cookies starting with "_ga"
                                    col2: 'Google Inc',
                                    col3: '2 Jahre',
                                    col4: 'Registriert eine eindeutige ID für einen Website-Besucher, die protokolliert, wie der Besucher die Website verwendet. Die Daten werden für Statistiken verwendet.',
                                    is_regex: true
                                },
                                {
                                    col1: '_gat_*****',
                                    col2: 'Google LLC',
                                    col3: 'eine Minute',
                                    col4: 'Wird von Google Analytics festgelegt, um die Anforderungsrate zu steuern.',
                                },
                                {
                                    col1: '_gid',
                                    col2: 'Google Inc',
                                    col3: '1 Tag',
                                    col4: 'Registriert eine eindeutige ID für einen Website-Besucher, die protokolliert, wie der Besucher die Website verwendet. Die Daten werden für Statistiken verwendet.',
                                }
                            ]
                        }, /*{
                            title: 'Werbe- und Targeting-Cookies',
                            description: 'Diese Cookies werden von unseren Werbepartnern auf unserer Website gesetzt. Diese Cookies können von Drittunternehmen verwendet werden, um ein Grundprofil Ihrer Interessen zu erstellen und relevante Anzeigen auf anderen Websites zu schalten. Sie identifizieren Ihren Browser und Ihr Gerät. Wenn Sie diese Cookies ablehnen, werden Sie von unserer gezielten Werbung auf anderen Websites nicht erfasst.',
                            toggle: {
                                value: 'targeting',
                                enabled: false,
                                readonly: false
                            }
                        }, */{
                            title: 'Weitere Informationen',
                            description: 'Bei Fragen zu unserer Politik in Bezug auf Cookies und Ihre Wahlmöglichkeiten wenden Sie sich bitte an <a class="cc-link" href="mailto:kontakt@weinundmehr.ch">kontakt@weinundmehr.ch</a>.',
                        }
                    ]
                }
            },
        }
    });
}
cookieconsentinit();
