{"version":3,"file":"../../javascript/map.js","names":["GuideMap","mapId","popout","options","defaults","mapTypeId","google","maps","MapTypeId","ROADMAP","scrollwheel","mapTypeControl","streetViewControl","$","extend","this","popoutMobile","map","Map","get","markers","bounds","LatLngBounds","activeMarker","activeMarkerId","current","on","e","preventDefault","closeDetails","openDetails","data","window","resize","event","trigger","fitBounds","offsetX","getDiv","width","offsetCenter","marker","getPosition","prototype","addMarkers","makeClickable","expIcon","url","size","Size","origin","Point","anchor","labelOrigin","propIcon","each","key","value","label","idx","text","color","fontSize","fontWeight","Marker","position","LatLng","lat","lng","icon","type","clickable","zIndex","active","addListener","id","html","category","child_friendly","filterExperiences","filterFn","gmap","m","setMap","addClass","setOpacity","setIcon","removeClass","latlng","offsetx","offsety","scale","Math","pow","getZoom","worldCoordinateCenter","getProjection","fromLatLngToPoint","pixelOffset","worldCoordinateNewCenter","x","y","newCenter","fromPointToLatLng","setCenter"],"sources":["map.js"],"mappings":"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","sourceRoot":"../../../../resources/javascript","sourcesContent":["/**\n * Basic map object takes jquery selector to find the map element\n * and a list of options to get passed directly into the map constructor\n * there are some default options set which can be overriden\n *\n * @param  selector   id\n * @param  selector   popout\n * @param  object   options\n * @author Neil Brayfield <neil@d3r.com>\n */\nvar GuideMap = function (mapId, popout, options) {\n    var defaults = {\n        mapTypeId: google.maps.MapTypeId.ROADMAP,\n        scrollwheel: true,\n        mapTypeControl: false,\n        streetViewControl: false\n    };\n\n    $.extend(defaults, options);\n    this.popout = $(popout);\n    this.popoutMobile = $(popout + '--mobile');\n    this.map = new google.maps.Map($(mapId).get(0), defaults);\n    this.markers = {};\n    this.bounds = new google.maps.LatLngBounds();\n\n    this.activeMarker = false;\n    this.activeMarkerId = false;\n\n    var current = this;\n\n    $('.guide-map__popout__close', popout).on('click', function(e) {\n        e.preventDefault();\n        current.closeDetails();\n    });\n\n    $('.guide-map__popout__close', this.popoutMobile).on('click', function(e) {\n        e.preventDefault();\n        current.closeDetails();\n    });\n\n    $('.guide-map__places__place').on('click', function(e) {\n        e.preventDefault();\n        current.openDetails($(this).data('id'));\n    });\n\n    $(window).resize(function() {\n        google.maps.event.trigger(current.map, 'resize');\n\n        current.map.fitBounds(current.bounds);\n\n        if (current.activeMarker) {\n            var offsetX = $(current.map.getDiv()).width() / 4;\n            current.offsetCenter(current.activeMarker.marker.getPosition(), offsetX, 0);\n        } else {\n\n        }\n\n    }).resize();\n};\n\n\nGuideMap.prototype.addMarkers = function(data, makeClickable) {\n\n    makeClickable = typeof makeClickable != 'undefined' ? makeClickable : true;\n\n    var expIcon = {\n        url: \"/images/map/experience-pin.png\",\n        size: new google.maps.Size(32, 38),\n        origin: new google.maps.Point(0,0),\n        anchor: new google.maps.Point(16, 38),\n        labelOrigin: new google.maps.Point(16,16)\n    };\n\n    var propIcon = {\n        url: \"/images/map/property-pin.png\",\n        size: new google.maps.Size(56, 56),\n        origin: new google.maps.Point(0,0),\n        anchor: new google.maps.Point(28, 56)\n    };\n\n    var current = this;\n\n    $.each(data, function(key, value) {\n        var label;\n        if (value.idx !== 'undefined' && value.idx > 0) {\n            label =  {\n                text: value.idx,\n                color:'#676767',\n                fontSize: '12px',\n                fontWeight: 'bold'\n            }\n        } else {\n            label = '';\n        }\n\n        var marker = new google.maps.Marker({\n            position: new google.maps.LatLng(value.lat, value.lng),\n            map: current.map,\n            icon: value.type === 'experience' ? expIcon : propIcon,\n            clickable: true,\n            label: label,\n            zIndex: 5,\n            type: value.type,\n            active: false\n        });\n\n        if (makeClickable) {\n            marker.addListener(\"click\", function() {\n                current.openDetails(value.id);\n            });\n        }\n\n        current.bounds.extend(marker.getPosition());\n\n        current.markers[value.id] = {\n            marker: marker,\n            html: value.html,\n            type: value.type\n        };\n        if (value.type == 'experience') {\n            current.markers[value.id].category = value.category;\n            current.markers[value.id].child_friendly = value.child_friendly == 'Y';\n        }\n    });\n\n};\n\n/**\n * Filter the experience markers displayed on the map.\n *\n * @author James Atkin <james.atkin@d3r.com>\n */\nGuideMap.prototype.filterExperiences = function(filterFn) {\n    var gmap;\n\n    gmap = this;\n    $.each(this.markers, function (id, m) {\n        if (m.type == 'experience') {\n            if (filterFn(id, m.category, m.child_friendly)) {\n                m.marker.setMap(gmap.map);\n            } else {\n                m.marker.setMap(null);\n                if (gmap.activeMarkerId && gmap.activeMarkerId == id) {\n                    gmap.closeDetails();\n                }\n            }\n        }\n    });\n};\n\n/**\n * Open the details popout\n *\n * @param  int id\n * @author Neil Brayfield <neil@d3r.com>\n */\nGuideMap.prototype.openDetails = function(id) {\n    this.popout.addClass('guide-map__popout--active');\n    this.popoutMobile.addClass('guide-map__popout--active');\n\n    this.popout.trigger('open');\n\n    // Swap the current active marker back to non-active\n\n    $.each(this.markers, function(key, value) {\n        if (key != id) {\n            value.marker.setOpacity(0.7);\n            if (value.marker.active == true) {\n                value.marker.setIcon(\"/images/map/\" + value.type + \"-pin.png\");\n                value.marker.active = false;\n            }\n        } else {\n            value.marker.setIcon(\"/images/map/\" + value.type + \"-pin-active.png\");\n            value.marker.setOpacity(1);\n            value.marker.active = true;\n        }\n    });\n\n    $('.guide-map__popout__content', this.popout).html(this.markers[id].html);\n    $('.guide-map__popout__content', this.popoutMobile).html(this.markers[id].html);\n\n    this.activeMarker = this.markers[id];\n    this.activeMarkerId = id;\n\n    var offsetX = $(this.map.getDiv()).width() / 4;\n\n    this.offsetCenter(this.markers[id].marker.getPosition(), offsetX, 0);\n};\n\n/**\n * Close the popout\n *\n * @author Neil Brayfield <neil@d3r.com>\n */\nGuideMap.prototype.closeDetails = function() {\n    this.popout.removeClass('guide-map__popout--active');\n    this.popoutMobile.removeClass('guide-map__popout--active');\n\n    this.popout.trigger('close');\n\n    $('.guide-map__popout__content', this.popoutMobile).html('');\n\n    $.each(this.markers, function(key, value) {\n        value.marker.setOpacity(1);\n        if (value.marker.active == true) {\n            value.marker.setIcon(\"/images/map/\" + value.type + \"-pin.png\");\n            value.marker.active = false;\n            }\n    });\n\n    this.activeMarker = false;\n    this.activeMarkerId = false;\n\n    this.map.fitBounds(this.bounds);\n};\n\n/**\n * Move the map to a specific marker and center it\n * on the right hand side\n *\n * @param  google.maps.LatLng latlng\n * @param  int offsetx\n * @param  int offsety\n * @author Neil Brayfield <neil@d3r.com>\n */\nGuideMap.prototype.offsetCenter = function(latlng, offsetx, offsety) {\n    var scale = Math.pow(2, this.map.getZoom());\n\n    var worldCoordinateCenter = this.map.getProjection().fromLatLngToPoint(latlng);\n    var pixelOffset = new google.maps.Point((offsetx/scale) || 0,(offsety/scale) ||0);\n\n    var worldCoordinateNewCenter = new google.maps.Point(\n        worldCoordinateCenter.x - pixelOffset.x,\n        worldCoordinateCenter.y + pixelOffset.y\n    );\n\n    var newCenter = this.map.getProjection().fromPointToLatLng(worldCoordinateNewCenter);\n\n    this.map.setCenter(newCenter);\n\n};\n"]}