/* * ExtMapTypeControl Class v1.3 * Copyright (c) 2007, Google * Author: Pamela Fox, others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This class lets you add a control to the map which mimics GMapTypeControl * and allows for the addition of a traffic button/traffic key. */ /* * Constructor for ExtMapTypeControl, which uses an option hash * to decide what elements to put in the control. * @param {opt_opts} Named optional arguments: * opt_opts.showTraffic {Boolean} Controls whether traffic button is shown * opt_opts.showTrafficKey {Boolean} Controls whether traffic key is shown */ function ExtMapTypeControl(opt_opts) { this.options = opt_opts || {}; }; ExtMapTypeControl.prototype = new GControl(); /** * Is called by GMap2's addOverlay method. Creates the button * and appends to the map div. * @param {GMap2} map The map that has had this ExtMapTypeControl added to it. * @return {DOM Object} Div that holds the control */ ExtMapTypeControl.prototype.initialize = function(map) { var container = document.createElement("div"); var me = this; var mapTypes = map.getMapTypes(); var mapTypeDivs = me.addMapTypeButtons_(map); GEvent.addListener(map, "addmaptype", function() { var newMapTypes = map.getMapTypes(); var newMapType = newMapTypes.pop(); var newMapTypeDiv = me.createButton_(newMapType.getName()); newMapTypeDiv.setAttribute('title', newMapType.getAlt()); mapTypes.push(newMapType); mapTypeDivs.push(newMapTypeDiv); me.resetButtonEvents_(map, mapTypeDivs); container.appendChild(newMapTypeDiv); }); GEvent.addListener(map, "removemaptype", function() { for (var i = 0; i < mapTypeDivs.length; i++) { GEvent.clearListeners(mapTypeDivs[i], "click"); container.removeChild(mapTypeDivs[i]); } mapTypeDivs = me.addMapTypeButtons_(map); me.resetButtonEvents_(map, mapTypeDivs); for (var i = 0; i < mapTypeDivs.length; i++ ) { container.appendChild(mapTypeDivs[i]); } }); if (me.options.showTraffic) { var trafficDiv = me.createButton_("Traffic"); trafficDiv.setAttribute('title', 'Show Traffic'); trafficDiv.style.marginRight = "8px"; trafficDiv.style.visibility = 'hidden'; trafficDiv.firstChild.style.cssFloat = "left"; trafficDiv.firstChild.style.styleFloat = "left"; // Sending true makes overlay hidden by default me.trafficInfo = new GTrafficOverlay({hide:true}); me.trafficInfo.hidden = true; // We have to do this so that we can sense if traffic is in view GEvent.addListener(me.trafficInfo, "changed", function(hasTrafficInView) { if (hasTrafficInView) { trafficDiv.style.visibility = 'visible'; } else { trafficDiv.style.visibility = 'hidden'; } }); map.addOverlay(me.trafficInfo); GEvent.addDomListener(trafficDiv.firstChild, "click", function() { if (me.trafficInfo.hidden) { me.trafficInfo.hidden = false; me.trafficInfo.show(); } else { me.trafficInfo.hidden = true; me.trafficInfo.hide(); } me.toggleButton_(trafficDiv.firstChild, !me.trafficInfo.hidden); }); if (me.options.showTrafficKey) { keyDiv = document.createElement("div"); keyDiv.style.cssFloat = "left"; keyDiv.style.styleFloat = "left"; keyDiv.innerHTML = " ? "; var keyExpandedDiv = document.createElement("div"); keyExpandedDiv.style.clear = "both"; keyExpandedDiv.style.padding = "2px"; var keyInfo = [{"color": "#30ac3e", "text": "> 50 MPH"}, {"color": "#ffcf00", "text": "25-50 MPH"}, {"color": "#ff0000", "text": "< 25 MPH"}, {"color": "#c0c0c0", "text": "No data"}]; for (var i = 0; i < keyInfo.length; i++) { keyExpandedDiv.innerHTML += "
  " + " " + keyInfo[i].text + " " + "
"; } keyExpandedDiv.style.display = "none"; GEvent.addDomListener(keyDiv, "click", function() { if (me.keyExpanded) { me.keyExpanded = false; keyExpandedDiv.style.display = "none"; } else { me.keyExpanded = true; keyExpandedDiv.style.display = "block"; } me.toggleButton_(keyDiv, me.keyExpanded); }); me.toggleButton_(keyDiv, me.keyExpanded); } var separatorDiv = document.createElement("div"); separatorDiv.style.clear = "both"; if (me.options.showTrafficKey) trafficDiv.appendChild(keyDiv); trafficDiv.appendChild(separatorDiv); if (me.options.showTrafficKey) trafficDiv.appendChild(keyExpandedDiv); me.toggleButton_(trafficDiv.firstChild, false); container.appendChild(trafficDiv); } for (var i = 0; i < mapTypeDivs.length; i++ ) { container.appendChild(mapTypeDivs[i]); } map.getContainer().appendChild(container); return container; }; /* * Creates buttons for map types. * @param {GMap2} Map object for which to create buttons. * @return {Array} Divs containing the buttons. */ ExtMapTypeControl.prototype.addMapTypeButtons_ = function(map) { var me = this; var mapTypes = map.getMapTypes(); var mapTypeDivs = new Array(); for (var i = 0; i < mapTypes.length; i++) { mapTypeDivs[i] = me.createButton_(mapTypes[i].getName()); mapTypeDivs[i].setAttribute('title', mapTypes[i].getAlt()); } me.resetButtonEvents_(map, mapTypeDivs); return mapTypeDivs; }; /* * Ensures that map type button events are assigned correctly. * @param {GMap2} Map object for which to reset events. * @param {Array} mapTypeDivs Divs containing map type buttons. */ ExtMapTypeControl.prototype.resetButtonEvents_ = function(map, mapTypeDivs) { var me = this; var mapTypes = map.getMapTypes(); for (var i = 0; i < mapTypeDivs.length; i++) { var otherDivs = new Array; for (var j = 0; j < mapTypes.length; j++ ) { if (j != i) { otherDivs.push(mapTypeDivs[j]); } } me.assignButtonEvent_(mapTypeDivs[i], map, mapTypes[i], otherDivs); } GEvent.addListener(map, "maptypechanged", function() { var divIndex = 0; var mapType = map.getCurrentMapType(); for (var i = 0; i < mapTypes.length; i++) { if (mapTypes[i] == mapType) { divIndex = i; } } GEvent.trigger(mapTypeDivs[divIndex], "click"); }); }; /* * Creates simple buttons with text nodes. * @param {String} text Text to display in button * @return {DOM Object} The div for the button. */ ExtMapTypeControl.prototype.createButton_ = function(text) { var buttonDiv = document.createElement("div"); this.setButtonStyle_(buttonDiv); buttonDiv.style.cssFloat = "left"; buttonDiv.style.styleFloat = "left"; var textDiv = document.createElement("div"); textDiv.appendChild(document.createTextNode(text)); textDiv.style.width = "6em"; buttonDiv.appendChild(textDiv); return buttonDiv; }; /* * Assigns events to MapType buttons to change maptype * and toggle button styles correctly for all buttons * when button is clicked. * @param {DOM Object} div Button's div to assign click to * @param {GMap2} Map object to change maptype of. * @param {Object} mapType GMapType to change map to when clicked * @param {Array} otherDivs Array of other button divs to toggle off */ ExtMapTypeControl.prototype.assignButtonEvent_ = function(div, map, mapType, otherDivs) { var me = this; GEvent.addDomListener(div, "click", function() { for (var i = 0; i < otherDivs.length; i++) { me.toggleButton_(otherDivs[i].firstChild, false); } me.toggleButton_(div.firstChild, true); map.setMapType(mapType); }); }; /* * Changes style of button to appear on/off depending on boolean passed in. * @param {DOM Object} div Button div to change style of * @param {Boolean} boolCheck Used to decide to use on style or off style */ ExtMapTypeControl.prototype.toggleButton_ = function(div, boolCheck) { div.style.fontWeight = boolCheck ? "bold" : ""; div.style.border = "1px solid white"; var shadows = boolCheck ? ["Top", "Left"] : ["Bottom", "Right"]; for (var j = 0; j < shadows.length; j++) { div.style["border" + shadows[j]] = "1px solid #b0b0b0"; } }; /* * Required by GMaps API for controls. * @return {GControlPosition} Default location for control */ ExtMapTypeControl.prototype.getDefaultPosition = function() { return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7)); }; /* * Sets the proper CSS for the given button element. * @param {DOM Object} button Button div to set style for */ ExtMapTypeControl.prototype.setButtonStyle_ = function(button) { button.style.color = "#000000"; button.style.backgroundColor = "white"; button.style.font = "small Arial"; button.style.border = "1px solid black"; button.style.padding = "0px"; button.style.margin= "0px"; button.style.textAlign = "center"; button.style.fontSize = "12px"; button.style.cursor = "pointer"; };