/** * The map object, null until script loads in. * @type {GMap2} */ var map = null; /** * The bounds of the markers once loaded in. * @type {GLatLngBounds} */ var bounds = null; /** * The marker with currently opened info window. * @type {GMarker} */ var currentMarker = null; /** * The dom element that the map is loaded into * @type {Element} */ var mapDiv = null; /** * The dom element that everything is a child of. * @type {Element} */ var containerDiv = null; /** * Position of mouse click (clientX) on map div when in static mode. * @type {Number} */ var clickedX = 0; /** * Position of mouse click (clientY) on map div when in static mode. * @type {Number} */ var clickedY = 0; /** * Indicates whether we've created a script tag with Maps API yet * @type {Boolean} */ var isLoaded = false; /** * Called after script is asynchronously loaded in. * Creates the GMap2, GMarker objects and performs actions according to * what the user did to trigger the map load (search, zoom, click etc). */ function loadMap() { if (GBrowserIsCompatible()) { mapDiv.style.background = '#fff'; mapDiv.style.cursor = ''; map = new GMap2(mapDiv, {logoPassive: true}); map.addControl(new GLargeMapControl()); map.enableScrollWheelZoom(); bounds = new GLatLngBounds(); for (var i = 0; i < businesses.length; i++) { bounds.extend(new GLatLng(businesses[i].lat, businesses[i].lng)); } var latSpan = bounds.toSpan().lat(); map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); // The static map server gives markers more space when calculating // bounds and zoom level, so sometimes the API will give a higher // zoom level than was used by the static map server. // The .98 value is just a guess right now, may need tweaking. var newBounds = map.getBounds(); var newLatSpan = newBounds.toSpan().lat(); if (latSpan/newLatSpan > .90) { map.zoomOut(); } for (var i = 0; i < businesses.length; i++) { var marker = createMarker(i); var latlng = marker.getLatLng(); var pixel = map.fromLatLngToDivPixel(latlng); if (Math.abs(pixel.x - clickedX) < 12 && Math.abs(pixel.y - clickedY) < 20) { //GEvent.trigger(marker, 'click'); } map.addOverlay(marker); } } } /** * Zooms to the viewport that fits all the markers. */ function zoomToAll() { map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); } /** * Creates a marker for the given business. * @param {Number} ind * @return {GMarker} */ function createMarker(ind) { var business = businesses[ind]; var marker = new GMarker(new GLatLng(business.lat, business.lng)); GEvent.addListener(marker, 'click', function() { marker.html = [ '
' , '' + business.name + '
' , business.address + '
' , business.price || business.stars ? '
' : '' , business.price ? '' + business.price + '' : '' , business.stars ? '
' : '' , business.price || business.stars ? '
' : '' , business.link ? '
' + business.link + '
' : '' , '
' ].join(''); currentMarker = marker; marker.openInfoWindowHtml(marker.html); }); return marker; } /** * Convenience function for creating an element and assigning an id to it. * @param {String} elementType * @param {String} id * @return {Element} */ function _cel(elementType, id) { var element = document.createElement(elementType); element.id = id; return element; } /** * Loads in the Maps API script. This is called after some sort of user interaction. * The script loads asynchronously and calls loadMap once it's in. */ function loadScript(key, hotels, reloadMap) { businesses = hotels; containerDiv = document.getElementById('container_map'); mapDiv = document.getElementById('map'); if (!isLoaded || reloadMap) { isLoaded = true; var div = document.createElement('div'); div.className = 'message'; div.innerHTML = 'Loading...'; div.style.left = '10px'; div.style.top = '10px'; mapDiv.appendChild(div); var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'http://maps.google.com/maps?file=api&v=2&async=2&callback=loadMap&key=' + key; document.body.appendChild(script); } } /** * Sets up the gadget by setting CSS and click events. */ function loadMapGadget(key, hotels) { businesses = hotels; containerDiv = document.getElementById('container_map'); mapDiv = document.getElementById('map'); mapDiv.onclick = function (e) { clickedX = (window.event && window.event.offsetX) || e.clientX; clickedY = (window.event && window.event.offsetY) || e.clientY; loadScript(key, hotels); }; mapDiv.style.cursor = 'pointer'; var urlString = ['http://maps.google.com/staticmap?markers=']; var markerString = []; for (var i = 0; i < businesses.length; i++) { markerString.push(businesses[i].lat + ',' + businesses[i].lng + ',red'); } urlString.push(markerString.join('|')); urlString.push('&size=375x285'); urlString.push('&key=' + key); mapDiv.style.background = 'url(\'' + urlString.join('') + '\')'; }